#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
答案 0 :(得分:2)
由于此表达式语句的操作优先级
m=++i || ++j && ++k;
相当于
m = ++i || ( ++j && ++k );
你可以想象它像
m = expression1 || expression2;
其中expression1
为++i
且expression2
为( ++j && ++k )
根据C标准(6.5.14 Logical OR运算符)
4与按位|不同运算符,||运营商保证 从左到右的评价;如果评估第二个操作数,则有 第一个和第二个的评估之间的序列点 操作数。 如果第一个操作数比较不等于0,则第二个操作数 操作数未评估。
由于expression1
将不等于0(其值等于11),因此不会评估expression2
。
因此,仅评估expression1
并且它不等于0.
根据C标准相同部分的另一个引用
3 ||如果任一操作数进行比较,则运算符将产生1 不等于0 ;否则,它产生0.结果的类型为int。
评估右侧的结果等于1分配给变量m
。
因此只更改了变量i
和m
。变量j
和k
未更改,因为它们作为操作数存在的表达式未被评估。
答案 1 :(得分:0)
我从10开始,但在测试之前会增加到11。
m被赋予布尔结果,因此将为0或1。
i非零,因此对于布尔表达式求值为true,因此,||之后的表达式不需要评估,因为||是一个布尔短路评估器。
因此你的输出。