【发布时间】:2015-06-12 16:27:43
【问题描述】:
这个警告是什么意思(i 和 j 不是常量):
我一直在尝试用谷歌搜索,但它没有给我任何结果。
警告:常数 10 与布尔表达式的比较是 始终为真 [-Wtautological-constant-out-of-range-compare]
if ((0<=i<=10)&&(0<=j<=10)){
在我的程序中,i 和 j 不是常量值,它们确实会发生变化。
【问题讨论】:
标签: c
这个警告是什么意思(i 和 j 不是常量):
我一直在尝试用谷歌搜索,但它没有给我任何结果。
警告:常数 10 与布尔表达式的比较是 始终为真 [-Wtautological-constant-out-of-range-compare]
if ((0<=i<=10)&&(0<=j<=10)){
在我的程序中,i 和 j 不是常量值,它们确实会发生变化。
【问题讨论】:
标签: c
在C 中,这样的关系运算符链接不是有效的设计。因此,
(0<=i<=10)
没有做你认为应该做的事情。它被评估为
((0<=i) <= 10 )
这基本上是
0 < = 10,产生 1(被认为是 TRUE 值)1 < = 10,也产生 1(被认为是 TRUE 值)遗憾的是,这两者都超出了预期的路径。
解决方案:您需要分解您的条件检查,例如
(0 <= i) && ( i<=10)
【讨论】:
其他答案已经解释了核心问题。您可以使用:
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) )
【讨论】:
我认为您需要更深入地了解您的陈述中发生的事情。
0<=i 是一个布尔表达式,它会变成真或假。
然后将该表达式的结果与 10 进行比较。
所以你最终会得到true <= 10 或false <= 10。
我想你是想写
if ( ( 0 <= i ) && ( i <= 10 ) )
您不能像以前那样将子句连接在一起。
【讨论】:
if ( ( 0 <= i) && (i <= 10))
if ( ( ( 0 <= i) && (i <= 10))&&( ( 0 <= j) && (j <= 10)) )
这意味着表达式可以在编译时进行评估,并且评估不会被编译,因为它在编译时是true(即非零)。
这通常发生在我不小心使用&& 而不是& 时。当然,这里不是这种情况,但它给出了相同的错误消息。
还要注意gcc 区分logical 和bitwise:
Logical 表示bool,0 表示false 或非零表示true,产生这些的运算符是&& 和关键字and。
Bitwise 表示boolean logic,运算符为&,关键字为bitand。
&& 总是产生bool,除非它是0,否则这是真的。如果在bools 上运行它们是等价的,但在任何& 和&& 上测试不同的东西,即。 “它是非零的吗”与“只返回匹配的位”。
【讨论】: