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