#include<stdio.h>
int main()
{
int i=-3, j=2, k=0, m;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
return 0;
}
为什么输出结果是-2 2 0 1?
一个逻辑是 (++j&& ++k) 不计算为 ++i 非零
但是因为 && 比 || 具有更高的偏好 为什么不计算它们
#include<stdio.h>
int main()
{
int i=-3, j=2, k=0, m;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
return 0;
}
为什么输出结果是-2 2 0 1?
一个逻辑是 (++j&& ++k) 不计算为 ++i 非零
但是因为 && 比 || 具有更高的偏好 为什么不计算它们
优先级不指定计算表达式的顺序。它指定如何解释表达式。在这种情况下,C 的优先规则(嵌入在其形式文法中)导致a || b && c
被解释为a || (b && c)
.
当计算这个表达式时,C 的规则指定a
必须首先计算。规则还规定,如果a
为真,则整个表达式的值为真,并且不计算右侧的||
值。
为了更清楚地看到这一点,请考虑表达式a + b < c * d
。优先规则导致 this 被解释为(a + b) < (c * d)
. 然而,与 不同的是,C 的规则并没有指定必须首先计算||
的左侧。<
编译器可能a + b
首先评估或c * d
首先评估,即使*
优先级高于+
. 允许编译器使用任何得到正确答案的评估顺序。
这里强加的唯一顺序是,a + b
并且c * d
必须在评估之前<
都进行评估。但是,这来自表达式的结构,而不是优先级规则。
运算符&&
和||
计算顺序是从左到右的。编译器保证||
如果左操作数的计算结果为真,则不会计算运算符的右操作数。
m = ++i || ++j && ++k;
++i
将首先执行。因为,i
将变成-2
,这意味着/等价于true
。它不会执行++j && ++k
part 并且m
value 将是1
.
因此,最终输出将变为-2 2 0 1
执行时||
,会先执行左手部分,如果是true
则不会执行右手部分。因为,无论是右部分true
还是false
. 因此,在您的情况下,执行的剩余部分||
并且由于它返回非零值,这意味着true
.
由于短路评估
m = ++i || ++j && ++k;
相当于
++i;
m = i != 0;
if(!m) {
++j;
m = j != 0;
if(m) {
++k;
m = k != 0;
}
}