这是我的计划:
int main(void)
{
int i, j, k, m;
i=-3, j=2, k=0;
m = k++ && ++i && ++j;
printf("%d, %d, %d, %d\n", i, j, k, m);
return 0;
}
上述程序的输出是:
-3 2 1 0
但是根据运算符优先级表,我应该首先评估++。 我也尝试在它们周围加上括号,但输出仍然相同。 我在某处读到,无论如何,将括号括起来都会先进行评估。
有人,请说清楚,如何评价。 提前谢谢。
答案 0 :(得分:4)
这里发生的事情是短路。 k++
评估为0
,这是错误的。因此,整个布尔表达式k++ && ++i && ++j
为false,因此永远不会执行++i
和++j
。
答案 1 :(得分:3)
您将优先级与评估顺序混淆。优先级定义了操作数的分组方式。 ++
的优先级越高,表达式就相当于:
m = (k++) && (++i) && (++j);
但评估顺序无关紧要。 &&
的快捷方式保证
它的左手操作数首先被评估。
通常,大多数运算符都没有指定评估顺序,但有四个例外:逻辑AND &&
,逻辑OR ||
,条件运算符?:
和逗号运算符{{1 }}
作为不同评估顺序的具体例子:
给定,
,int i = 0
的结果未指定,编译器可能首先评估i + (i++)
,这会修改i++
的值,编译器可能会选择评估i
{1}}首先。你应该避免使用这些表达式。
另一方面,确定i
的结果,因为i && (i++)
确保首先评估左操作数&&
,因为它是零,右操作数i
永远不会被评估。