在C中,这是合法的吗?
if (0<=x<=y<=y+1) then ...
或者我是否必须将它与&amp;&amp;和s |和括号分开?
答案 0 :(得分:7)
这是合法的,但可能没有达到预期效果。它被视为你写的:
if (((0 <= x) <= y) <= y+1)
(0 <= x)
评估为0或1; 0或1与y
进行比较,产生另一个0或1结果;这与y+1
进行比较,产生用于控制if
语句的最终0或1。
如果您的目标是确保x
不小于零或大于y
,并确保y
不大于y+1
,那么你会写:
if (0 <= x && x <= y && y <= y+1)
我注意到y <= y+1
通常是正确的。如果y
是无符号类型且等于该类型的最大值,则y+1
为0.如果y
是有符号类型且等于该类型的最大值,则通过向其添加1来调用未定义的行为。如果你很幸运,y+1
将包装到签名类型的最大负值,但你不能依赖它(所以也许这会使它“如果你不走运”,因为这个错误赢了'必须在它引起重大问题之前出现。)
答案 1 :(得分:3)
这是合法的(并定义;谷歌搜索术语'运营商优先'),但我不认为它会做你期望或意味着做它。
答案 2 :(得分:1)
不,尽管这是合法的C代码,但根本不可能做你想做的事。你必须使用&amp;&amp;或||。原因是你实际上看到,例如,y是否大于或等于布尔值,在C和C ++中通常只有0和1。
答案 3 :(得分:1)
这完全合法但实际上没用。您应该使用&&
和/或||
构建正确的表达式。