#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&amp;&amp; ++ k)不计算为++ i非零
但作为&amp;&amp;比||有更高的偏好为什么他们没有计算
答案 0 :(得分:5)
优先级不指定计算表达式的顺序。它指定如何解释表达式。在这种情况下,C的优先规则(嵌入在其正式语法中)会导致a || b && c
被解释为a || (b && c)
。
评估此表达式时,C的规则指定必须首先评估a
。规则还规定如果a
为真,那么整个表达式的值为true,而||
的右侧不会被评估。
要更清楚地看到这一点,请考虑表达式a + b < c * d
。优先规则会将其解释为(a + b) < (c * d)
。但是,与||
不同,C的规则未指定必须首先评估<
的左侧。尽管a + b
的优先级高于c * d
,编译器可能会先评估*
或+
。允许编译器使用任何得到正确答案的评估顺序。
此处强加的唯一顺序是a + b
和c * d
必须在评估<
之前进行评估。但是,这来自表达式的结构,而不是优先规则。
答案 1 :(得分:4)
运算符&&
和||
计算顺序是从左到右。编译器保证如果左操作数的计算结果为true,则不会计算运算符的||
右操作数。
答案 2 :(得分:1)
m = ++i || ++j && ++k;
++i
将首先执行。由于i
将成为-2
,这意味着/等同于true
。它不会执行++j && ++k
部分,m
值将为1
。
因此,最终输出将变为-2 2 0 1
执行||
时,它将首先执行左手部分,如果是true
,则它将不会向右执行。因为,右边部分是true
还是false
并不重要。因此,在您的情况下,||
的左侧部分已执行,因为它返回非零值,这意味着true
。
答案 3 :(得分:1)
由于短路评估
m = ++i || ++j && ++k;
相当于
++i;
m = i != 0;
if(!m) {
++j;
m = j != 0;
if(m) {
++k;
m = k != 0;
}
}