【问题标题】:Bug in the code代码中的错误
【发布时间】:2015-02-04 19:41:37
【问题描述】:

这段代码总是在打印

罚款卢比。 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");
}

【问题讨论】:

  • 正确的代码格式,尤其是缩进,会让它更容易阅读。
  • 添加一个有意义的标题也会有所帮助。
  • 我确定这是重复的(我之前回答过关于 x &lt; y &lt; z 的问题)。

标签: c printf logical-operators


【解决方案1】:

改变

if (5<days<=10)

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

其他人也一样。

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

if ( (5 < days) <=10)

所以,无论您为days [6 及以上输入什么值,记住第一个if],&lt; 操作的结果将始终产生01,两者都是&lt;= 10,因此使条件为真,打印fine Rs. 1

相关阅读:C operator precedence.

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

【讨论】:

  • 不应该是&amp;&amp;吗?
  • 这里需要的是 && 运算符,而不是 ||。
【解决方案2】:

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

要解决此问题,请使用比较运算符 &amp;&amp;(和)。 if(5 &lt; days &amp;&amp; days &lt;= 10) 被解析为((5 &lt; days) &amp;&amp; (days &lt;= 10)),因此您首先正确地将days 变量与510 进行比较,然后获取每个语句的真值并查看5 &lt; days days &lt;= 10 是真的。

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

【讨论】:

    【解决方案3】:

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

    if (5<days<=10)
    

    编辑成

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

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

    【讨论】:

      【解决方案4】:
      if (5<days<=10)
      

      语法不正确

      应该是

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多