代码中的错误

时间:2015-02-04 19:41:38

标签: c printf logical-operators

此代码始终打印

  

罚款卢比。 1

尽管输入的天数为> 30。是什么原因?

#include<stdio.h>

int main(void)
{
    int days;
    printf("enter no. of days");
    scanf("%d",&days);
    if (days<=5){printf("fine 50 paise");}
    else if (5<days<=10){printf("fine Rs. 1");}
    else if (10<days<30){printf("fine Rs.5");}
    else printf(" memebership cancelled");
}

4 个答案:

答案 0 :(得分:4)

更改

if (5<days<=10)

if (5<days && days <= 10)

其他人也一样。

否则,在您的代码中,条件检查的行为类似于

if ( (5 < days) <=10)

因此,无论您为days [6及更高版本输入的值,保留第一个if<操作的结果将始终产生01,均为<= 10,因此条件为TRUE,打印fine Rs. 1

相关阅读:C operator precedence

注意:最好在return的结束}之前添加main()语句

答案 1 :(得分:2)

C分段解析语句(例如if(5<days<=10)),而不是试图从整体上解释它们。这意味着编译器将if(5<days<=10)读为if((5<days)<=10)。请注意,这意味着5<days结果10进行比较,而不是变量days。要展开,任何比较运算符(<>==等)的结果都是一个整数,表示它是真还是假(这称为boolean值,值为true或false),分别为1或0。因此,假设5<days为真,则下一个比较为1<=10(如果天数小于5,则为0<=10,当然这总是正确的。

要解决此问题,请使用比较运算符&&(和)。 if(5 < days && days <= 10)被解析为((5 < days) && (days <= 10)),因此您首先将days变量与510进行比较,然后将每个变量的真值都计算在内并查看5 < days days <= 10是否属实。

最后一点 - 0始终为false,任何非零始终为true,因此if(0)将始终为false,if(5)将始终为true。

答案 2 :(得分:1)

由于第二个if条件,我不知道是否允许您按照您在代码中使用的方式使用条件:

if (5<days<=10)

将其编辑为

if(days > 5 && days <= 10)

它会起作用,也会相应地编辑第三个条件。

答案 3 :(得分:0)

if (5<days<=10)

的语法不正确

应该是

if(5<days && days<=10)

改变它,你的问题应该解决。 :)