这段代码中语句的求值顺序是什么?
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 == 1
和k++
。由于第一个序列点的计算结果为假(在 C 域中为 0
),因此对第二个序列点进行计算(因为短路运算符为 ||
)。第二个序列 returns 为真(或 1
)。因此,您将整个表达式分解为:0 || 1
。因此 x
是 1
.
k
是 9
因为 k++
;
HTH.
我遇到了这个问题。
#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 == 1
和k++
。由于第一个序列点的计算结果为假(在 C 域中为 0
),因此对第二个序列点进行计算(因为短路运算符为 ||
)。第二个序列 returns 为真(或 1
)。因此,您将整个表达式分解为:0 || 1
。因此 x
是 1
.
k
是 9
因为 k++
;
HTH.