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

spa*_*ara 0 c operators

在C中,这是合法的吗?

if (0<=x<=y<=y+1) then ...
Run Code Online (Sandbox Code Playgroud)

或者我必须用&&和||和括号分开它?

Jon*_*ler 7

这是合法的,但可能不符合您的期望.它被视为你写的:

if (((0 <= x) <= y) <= y+1)
Run Code Online (Sandbox Code Playgroud)

(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)
Run Code Online (Sandbox Code Playgroud)

我注意到这y <= y+1通常是正确的.如果y是无符号类型且等于该类型的最大值,y+1则为0.如果y是有符号类型且等于该类型的最大值,则通过向其添加1来调用未定义的行为.如果你很幸运,y+1将包装到签名类型的最大负值,但你不能依赖它(所以也许这会使它"如果你不走运",因为这个bug不一定会出现在它会导致重大问题).