C:具有多个运算符的条件表达式

时间:2012-09-22 18:49:14

标签: c operators

在C中,这是合法的吗?

if (0<=x<=y<=y+1) then ...

或者我是否必须将它与&amp;&amp;和s |和括号分开?

4 个答案:

答案 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)

这完全合法但实际上没用。您应该使用&&和/或||构建正确的表达式。