0

在 C 中,这样的事情合法吗?

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

还是我必须用 &&'s 和 ||'s 和括号分隔它?

4

4 回答 4

7

这是合法的,但可能不符合您的预期。它被视为您写过:

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将包装到签名类型的最大负值,但你不能依赖它(所以也许这使它成为“如果你不走运”,因为错误不一定会出现之前它会导致重大问题)。

于 2012-09-22T18:52:35.203 回答
3

它是合法的(并且已定义;Google 搜索词“运算符优先级”),但我认为它不会按照您的期望或意图执行。

于 2012-09-22T18:52:56.847 回答
1

不,这根本不可能做你想做的事,尽管它是合法的 C 代码。您必须使用 && 或 ||。原因是您实际上是在查看,例如,y 是否大于或等于布尔值,在 C 和 C++ 中,布尔值通常只是 0 和 1。

于 2012-09-22T18:52:17.300 回答
1

这是完全合法的,但实际上没有用。&&您应该使用and/or构建正确的表达式||

于 2012-09-22T18:53:36.807 回答