这段代码中语句的求值顺序是什么?

What is the order of evaluation of the statements in this code?

我遇到了这个问题。

#include <stdio.h>
int main()
{
int k=8;
int x=0==1||k++;
printf("%d  %d",x,k);
    return 0;
}

输出为1 9

因为这个 answer 表明

Unlike the bitwise | operator, the || operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares unequal to 0, the second operand is not evaluated.

我无法理解语句 int x=0==1||k++ 是如何计算的,因此 x 和 k 的值分别变为 1,9。

谁能解释一下编译器在 c 中是如何计算这些语句的?

"Unlike the bitwise | operator, the || operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares unequal to 0, the second operand is not evaluated."

是的,这是真的...

要弄清楚 首先确保您了解这些基础知识

1) (1 || any_var) 是 1

2)运算符优先级如下

++

然后

==

然后

||

现在 来解决您对 || 的疑问对比 |

注意 | (单管道)运算符..,将同时执行 LHS 和 RHS,无论如何)

|| (双管道)评估 || 的 LHS首先,如果它是 1,则不需要评估 RHS(速度)

|| 的右轴如果 LHS 为真,运算符将不会被计算.

但是 这里 0==1 是错误的,即 0==1 returns 0

因此 RHS 将被评估

所以声明

k++被执行

但使用了 8(正如 post 增量运算符的 属性 所说--> 先使用然后增量)

所以 0||8 绝对正确 (1) 所以 x 的计算结果为 1

然后k在序列点之后递增,即k等于9

因此输出 x=1 和 k=9

我希望它能消除你的疑虑:)

运营商|| (OR) 在以下情况下计算结果为真:

例如:A || B

  • A为真,
  • B为真,
  • 两者都是正确的

因为此操作使用 Short-Circuit Evaluation 如果 A 被评估为真,这意味着该语句已经为真并且它不会评估 B.

在你的情况下 0==1(0 等于 1)显然是错误的,因此它将计算 k++。 k++ 是一个棘手的问题(在我看来)。在 C true/false 的世界中,评估是基于是否为 0(除了 false 表示小于 0 的次数......)但在 true/false 评估中,0 为 false,其他一切为 true。

K++ 表示计算 K 然后递增,因此,如果 K 为 0,它将为 false 并变为 1,如果为其他任何值,它将为true 然后递增。

在您的情况下,k == 8 因此 k++ 的结果为 TRUE,k 将变为 9。K 为真意味着 x 评估结果为 TRUE(为 FALSE 或 TRUE)。

所以输出为 1(True) 9(8++)

x 为 1,因为表达式:0==1||k++ 结果为真(在 C 国为 1)。你为什么问?这里有两个序列点:0 == 1k++。由于第一个序列点的计算结果为假(在 C 域中为 0),因此对第二个序列点进行计算(因为短路运算符为 ||)。第二个序列 returns 为真(或 1)。因此,您将整个表达式分解为:0 || 1。因此 x1.

k9 因为 k++;

HTH.