解释逻辑 #包括 //编译器版本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); }
谁能解释一下逻辑,输出是11,2,0,1解释逻辑 #包括 //编译器版本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=+
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;