运算符优先级在该程序中实际上是如何工作的?
How does operator precedence actually work in this program?
#include<stdio.h>
int main()
{
int i=-1, j=-1, k=-1, l=2, m;
m = (i++ && j++ && k++) || (l++);
printf("%d %d %d %d %d", i, j, k, l, m);
}
我对给定程序中运算符优先级在计算逻辑表达式时的工作方式感到困惑。
变量 m
将被分配 0
或 1
取决于它后面的逻辑表达式的值。
将评估第一个括号,并且两个 AND 运算的总体结果将为真或 1
。但是,由于使用了短路逻辑或,第二个括号没有得到评估。
所以,我的问题是,如果括号的优先级高于该表达式中的所有其他运算符,为什么不先计算两个括号,然后再执行 OR 运算?
也就是说,为什么输出是 0 0 0 2 1
而不是 0 0 0 3 1
?
编辑:
我问的与 有所不同(建议重复)
因为我要强调包含 OR 运算符的第二个操作数的括号。
运算符优先级在出现歧义时生效。
在这种情况下,规范非常明确。
The ||
operator shall yield 1
if either of its operands compare unequal to 0
; otherwise, it
yields 0
. The result has type int
.
并且,(强调我的)
Unlike the bitwise |
operator, the ||
operator guarantees left-to-right evaluation; if the
second operand is evaluated, there is a sequence point between the evaluations of the first
and second operands. If the first operand compares unequal to 0
, the second operand is
not evaluated.
在你的情况下,
(i++ && j++ && k++) || (l++);
(i++ && j++ && k++)
是左操作数,(l++);
是右操作数,其余的应该很清楚了。 :)
运算符优先级(和结合性)只决定表达式的解析方式。将它与 操作数的计算顺序 混淆是一个常见的错误,这是不同的东西。在此示例中,运算符优先级无关紧要。
对于 C 中的大多数运算符,未指定操作数的计算顺序。如果你写 true | l++
那么 l++
就会被执行。 "short-circuit evaluation" 是您的代码中没有发生这种情况的原因。 && ||
运算符是一种特殊情况,因为它们明确定义了求值顺序。 ||
的右操作数保证不会被计算,以防左操作数的计算结果为非零。
#include<stdio.h>
int main()
{
int i=-1, j=-1, k=-1, l=2, m;
m = (i++ && j++ && k++) || (l++);
printf("%d %d %d %d %d", i, j, k, l, m);
}
我对给定程序中运算符优先级在计算逻辑表达式时的工作方式感到困惑。
变量 m
将被分配 0
或 1
取决于它后面的逻辑表达式的值。
将评估第一个括号,并且两个 AND 运算的总体结果将为真或 1
。但是,由于使用了短路逻辑或,第二个括号没有得到评估。
所以,我的问题是,如果括号的优先级高于该表达式中的所有其他运算符,为什么不先计算两个括号,然后再执行 OR 运算?
也就是说,为什么输出是 0 0 0 2 1
而不是 0 0 0 3 1
?
编辑:
我问的与
运算符优先级在出现歧义时生效。
在这种情况下,规范非常明确。
The
||
operator shall yield1
if either of its operands compare unequal to0
; otherwise, it yields0
. The result has typeint
.
并且,(强调我的)
Unlike the bitwise
|
operator, the||
operator guarantees left-to-right evaluation; if the second operand is evaluated, there is a sequence point between the evaluations of the first and second operands. If the first operand compares unequal to0
, the second operand is not evaluated.
在你的情况下,
(i++ && j++ && k++) || (l++);
(i++ && j++ && k++)
是左操作数,(l++);
是右操作数,其余的应该很清楚了。 :)
运算符优先级(和结合性)只决定表达式的解析方式。将它与 操作数的计算顺序 混淆是一个常见的错误,这是不同的东西。在此示例中,运算符优先级无关紧要。
对于 C 中的大多数运算符,未指定操作数的计算顺序。如果你写 true | l++
那么 l++
就会被执行。 "short-circuit evaluation" 是您的代码中没有发生这种情况的原因。 && ||
运算符是一种特殊情况,因为它们明确定义了求值顺序。 ||
的右操作数保证不会被计算,以防左操作数的计算结果为非零。