12

为什么这段代码总是产生x=2

unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
4

10 回答 10

30

第一个x++将 x 更改为 1 并返回 0
第二个x++将 x 更改为 2 并返回 1

此时 or 短路,返回 true,并使 x 为 2。

于 2010-01-14T19:45:27.070 回答
11

x++ || x++ || x++ || x++ || …………;

  • 对于条件检查,第一个 x++ 首先计算为 0,然后是一个增量。因此,第一个条件失败,但 x 递增到 1。
  • 现在第二个 x++ 被评估,它评估为 1 以进行条件检查,并且 x 增加为 2。由于表达式评估为 1(真),因此无需进一步。
于 2010-01-14T19:45:55.307 回答
9

因为布尔表达式评估中的短路||并且因为是 C 和 C++ 中的序列点

于 2010-01-14T19:44:58.430 回答
5

||短路。从左开始求值,当找到真值(非零)时,它停止求值,因为表达式现在为真,再也不会为假。

首先x++评估为 0(因为它是后增量),其次评估为 1,这是正确的,并且很快,你就完成了!

于 2010-01-14T19:45:31.970 回答
2

当您评估“a || b || c || d || e || ...”时,您可以在找到的第一个非零值处停止评估。

第一个“x++”计算为 0,并将 x 递增到 1,然后继续计算表达式。第二个 x++ 被评估为 1,将 x 增加到 2,此时,您无需查看 OR 语句的其余部分即可知道它将为真,因此您停止。

于 2010-01-14T19:46:50.640 回答
1

因为当找到真值时逻辑或短路。

所以第一个 x++ 返回 0(假),因为它是后增量。(x = 1) 第二个 x++ 返回 1 (true) - 短路。(x = 2)

打印 x = 2;

于 2010-01-14T19:46:47.643 回答
1

因为早期的比较评估。

这相当于

 0++ | 1++

编译器在 x==1 时立即退出比较,然后发布增量,使 x==2

于 2010-01-14T19:46:50.547 回答
1

因为第一个“x++ || x++”的计算结果为“真”(意味着它不为零,因为“0 || 1”为真。由于它们都是逻辑或运算符,其余的或运算将被忽略。

麦克风

于 2010-01-14T19:47:38.907 回答
1

运算符计算||左侧表达式,如果为 0(假),则计算右侧表达式。如果左侧不为 0,则根本不会评估右侧。

在表达式x++ || x++ || x++ || ...中,第一个x++被评估;它评估为 0,x 递增到 1。第二个x++被评估;它的计算结果为 1,x 增加为 2。由于第二个x++计算结果为非零值,因此不会计算剩余的x++表达式。

于 2010-01-14T19:48:28.810 回答
0

尝试替换|||.--

这是逻辑运算符的短路。

当你这样做的时候也是一样的原因

if (returns_true() || returns_true()){ }

returns_true只会被调用一次。

于 2010-01-14T19:45:55.523 回答