据我所知,逻辑运算符的&&优先级高于||.在运行代码时:
#include <stdio.h>
int main()
{
int i = 1, j =1, k = 1;
printf("%d\n",++i || ++j && ++k);
printf("%d %d %d",i,j,k);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给出输出:
1
2 1 1
Run Code Online (Sandbox Code Playgroud)
只有在这样++i || ++j && ++k评估时才有可能:
(++i) || (++j && ++k)
Run Code Online (Sandbox Code Playgroud)
但是,根据运算符优先级规则,它应该被评估为:
(++i || ++j) && (++k)
Run Code Online (Sandbox Code Playgroud)
因此输出应该是:
1
2 1 2
Run Code Online (Sandbox Code Playgroud)
这有什么问题?
注意:根据我的理解,我认为具有更高优先级的运算符如下评估(如果它是左关联的):
1.评估其左表达式
2.然后评估其正确的表达式(如果需要)
我错了吗?
我不明白以下程序的输出:
#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这似乎与&&运算符具有更高优先级的事实相矛盾||.
有人解释原因吗?