解释逻辑 #包括 //编译器版本gcc 6.3.0 内部主(空) { int i=10,j=2,k=0,m; m=++i | |++j&&++k; printf(“%d,%d,%d,%d”,i,j,k,m); }

解释逻辑 #包括 //编译器版本gcc 6.3.0 内部主(空) { int i=10,j=2,k=0,m; m=++i | |++j&&++k; printf(“%d,%d,%d,%d”,i,j,k,m); },c,logical-operators,logical-or,C,Logical Operators,Logical Or,谁能解释一下逻辑,输出是11,2,0,1 i从10开始,但在测试之前,它会增加到11 m被分配一个布尔结果,因此将为0或1 i为非零,因此布尔表达式的计算结果为true,因此,不需要计算| |之后的表达式,因为| |是布尔短路求值器 因此您的输出。由于此表达式语句的操作优先级 #include <stdio.h> //Compiler version gcc 6.3.0 int main(void) { int i=10, j=2, k=0, m; m=+

谁能解释一下逻辑,输出是11,2,0,1


i从10开始,但在测试之前,它会增加到11

m被分配一个布尔结果,因此将为0或1

i为非零,因此布尔表达式的计算结果为true,因此,不需要计算| |之后的表达式,因为| |是布尔短路求值器


因此您的输出。

由于此表达式语句的操作优先级

  #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);
 }
相当于

m=++i || ++j && ++k;
你可以想象它是什么样子

m = ++i || ( ++j && ++k );
其中
expression1
++i
expression2
(++j&&++k)

根据C标准(6.5.14逻辑或运算符)

4与按位|运算符不同,| |运算符保证 从左到右评价;如果对第二个操作数求值,则 第一次和第二次评估之间的序列点 操作数如果第一个操作数比较不等于0,则第二个操作数 未计算操作数

由于
expression1
比较不等于0(其值等于11),因此不计算
expression2

因此,只计算表达式1,它不等于0

根据C标准同一章节的另一引用

3如果| |运算符的任何一个操作数进行比较,则| |运算符应产生1 不等于0;否则,结果为0。结果的类型为int

右侧的计算结果等于分配给变量
m
的1


因此,只有变量
i
m
发生了变化。变量
j
k
没有更改,因为它们作为操作数出现的表达式没有计算。

您是否尝试过在纸上查看它?你知道“短路评估”吗?@Caleb的可能副本一点也不知道,这里的一切都是有序的和定义良好的。@Caleb这段代码定义良好,UB或序列点没有问题。
m = expression1 || expression2;