#include <stdio.h>
//Compiler version gcc 6.3.0
int main(void)
{
int i=10, j=2, k=0, m;
m=++i || ++j && ++k;
printf("%d,%d,%d,%d",i,j,k,m);
}
谁能解释一下逻辑,输出是11,2,0,1
#include <stdio.h>
//Compiler version gcc 6.3.0
int main(void)
{
int i=10, j=2, k=0, m;
m=++i || ++j && ++k;
printf("%d,%d,%d,%d",i,j,k,m);
}
谁能解释一下逻辑,输出是11,2,0,1
由于操作的优先级,这个表达式语句
m=++i || ++j && ++k;
相当于
m = ++i || ( ++j && ++k );
你可以想象它像
m = expression1 || expression2;
在哪里和expression1
是++i
expression2
( ++j && ++k )
根据 C 标准(6.5.14 逻辑或运算符)
4 不同于按位 | 运算符,|| 运算符保证从左到右的评估;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较不等于 0,则不计算第二个操作数。
由于expression1
比较不等于 0(其值等于 11)expression2
,则不进行评估。
因此 onlyexpression1
被评估并且它不等于 0。
根据 C 标准同一部分的另一个引用
3 || 如果任一操作数比较不等于 0 ,则运算符应产生 1 ;否则,它产生 0。结果具有 int 类型。
右侧的评估结果等于分配给变量的 1 m
。
因此只有变量i
和m
被改变了。变量j
和k
没有改变,因为它们作为操作数存在的表达式没有被计算。
i 从 10 开始,但在测试之前递增到 11。
m 被分配一个布尔结果,因此将是 0 或 1。
i 不为零,因此对于布尔表达式的计算结果为 true,因此,|| 之后的表达式 不需要评估,因为 || 是一个布尔短路评估器。
因此你的输出。