【问题标题】:What does "Comparing constant with boolean expression is always true" warning mean?“比较常量与布尔表达式总是正确的”警告是什么意思?
【发布时间】:2015-06-12 16:27:43
【问题描述】:

这个警告是什么意思(ij 不是常量):

我一直在尝试用谷歌搜索,但它没有给我任何结果。

警告:常数 10 与布尔表达式的比较是 始终为真 [-Wtautological-constant-out-of-range-compare]

 if ((0<=i<=10)&&(0<=j<=10)){

在我的程序中,ij 不是常量值,它们确实会发生变化。

【问题讨论】:

    标签: c


    【解决方案1】:

    C 中,这样的关系运算符链接不是有效的设计。因此,

     (0<=i<=10)
    

    没有做你认为应该做的事情。它被评估为

    ((0<=i) <= 10 )
    

    这基本上是

    • 0 &lt; = 10,产生 1(被认为是 TRUE 值)
    • 1 &lt; = 10,也产生 1(被认为是 TRUE 值)

    遗憾的是,这两者都超出了预期的路径。

    解决方案:您需要分解您的条件检查,例如

     (0 <= i) && ( i<=10)
    

    【讨论】:

    • 哦,我明白了:D 非常感谢!傻我....正在努力弄清楚为什么它不起作用....
    【解决方案2】:

    其他答案已经解释了核心问题。您可以使用:

    if ( ( ( 0 <= i) && (i <= 10)) && ( ( 0 <= i) && (i <= 10)) ) 
    

    解决您的问题。

    我的建议是将逻辑包装在一个函数中。

    int isInRange(int x, int lower, int upper)
    {
       return (lower <= x && x <= upper);
    }
    

    并使用

    if ( isInRange(i, 0, 10) && isInRange(j, 0, 10) )
    

    【讨论】:

    • +1 非常感谢 :) 我不明白一件事:为什么您建议使用函数而不是以前的方式?我应该注意什么特别的原因吗?
    • @TheArtist。几个原因。 1)您避免重复捕获逻辑的代码。 2)您定义操作的名称,这使代码更具可读性。
    • 谢谢。我明白了。
    【解决方案3】:

    我认为您需要更深入地了解您的陈述中发生的事情。

    0&lt;=i 是一个布尔表达式,它会变成真或假。 然后将该表达式的结果与 10 进行比较。

    所以你最终会得到true &lt;= 10false &lt;= 10

    我想你是想写

    if ( ( 0 <= i ) && ( i <= 10 ) )
    

    您不能像以前那样将子句连接在一起。

    【讨论】:

    • +1 非常感谢 :D 哦,是的,这很有帮助,我不知道机制。非常感谢。
    • 我怀疑他想用if ( ( 0 &lt;= i) &amp;&amp; (i &lt;= 10))
    • @RSahu 是的,这就是我想要使用的。
    • 所以我相信我的完整 if 语句应该是: if ( ( ( 0
    • 试试if ( ( ( 0 &lt;= i) &amp;&amp; (i &lt;= 10))&amp;&amp;( ( 0 &lt;= j) &amp;&amp; (j &lt;= 10)) )
    【解决方案4】:

    这意味着表达式可以在编译时进行评估,并且评估不会被编译,因为它在编译时是true(即非零)。

    这通常发生在我不小心使用&amp;&amp; 而不是&amp; 时。当然,这里不是这种情况,但它给出了相同的错误消息。

    还要注意gcc 区分logicalbitwise

    Logical 表示bool0 表示false 或非零表示true,产生这些的运算符是&amp;&amp; 和关键字and

    Bitwise 表示boolean logic,运算符为&amp;,关键字为bitand

    &amp;&amp; 总是产生bool,除非它是0,否则这是真的。如果在bools 上运行它们是等价的,但在任何&amp;&amp;&amp; 上测试不同的东西,即。 “它是非零的吗”与“只返回匹配的位”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 2012-06-10
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      相关资源
      最近更新 更多