6 c
我不明白以下程序的输出:
#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;
}
Run Code Online (Sandbox Code Playgroud)
输出-2 2 0 1代替-2 3 1 1,意味着在表达式之前++i评估(并导致||运算符使其右侧短路),++j && ++k这似乎与&&运算符具有更高优先级的事实相矛盾||.
有人解释原因吗?
Jer*_*fin 22
输出应该是这样的:
Error, line 2: 'm': undefined variable.
Run Code Online (Sandbox Code Playgroud)
编辑:修复后,只++i应评估.优先权不会决定(甚至影响)评估顺序.优先级意味着表达式等同于++i || (++j && ++k).评估的顺序||或者&&总是评估左操作数,然后是一个序列点.在序列点之后,当且仅在必要时评估右操作数以确定最终结果(即,||如果左操作数被评估为零,&&则评估右操作数; 如果左操作数被评估为非,则评估右操作数-零).
在这个表达式中,++i进行求值,然后因为它是左操作数||并且求值为非零,所以不评估表达式的其余部分.
表达方式:
++i || ++j && ++k
Run Code Online (Sandbox Code Playgroud)
相当于:
(++i) || ((++j) && (++k))
Run Code Online (Sandbox Code Playgroud)
解释:
++i被评估—— (-2) || ((++j) && (++k));||符被评估 - (1);由于1 || anything计算结果为 true,因此不会计算正确的操作数。因此,&&优先级在这里并不重要。这种短路在 C 和 C++ 中均由相关标准保证(请参阅是否强制要求短路逻辑运算符?以及求值顺序?)。
现在,尝试使用子表达式,如下所示:
(++i || ++j) && ++k
Run Code Online (Sandbox Code Playgroud)
这相当于:
((++i) || (++j)) && (++k)
Run Code Online (Sandbox Code Playgroud)
解释:
++i被评估—— ((-2) || (++j)) && (++k);||被评估——(1) && (++k)++k被评估—— (1) && (1);