增量运算符不起作用。
我正在学习C语言表达。我还尝试了对变量使用增量运算符(前缀和后缀)的不同组合,但输出结果是相同的。
int i=-3, j=2 ,k=0,m;
m=++i&&++j||++k;
printf("%d%d%d%d\n",i,j,k,m);
我希望输出为-2311
,但结果为-2301
。
答案 0 :(得分:4)
i
和j
递增,因为需要评估i
。还需要评估j
,因为i
非零。
但是由于此组合表达式非零,所以||
短路,并且k++
不被评估或执行。
另一方面,按位运算符不会短路。它们也不会转换为布尔值。如果您想评估所有条件并保持相同的结果,则可以编写
m= (!!++i) & (!!++j) | (!!++k);
使用双重否定技巧将整数值转换为布尔值。
或者保留另一条语句并简化为(由user694733提供):
++i; ++j; ++k;
m = i && j || k;
答案 1 :(得分:1)
&&
和||
运算符短路-根据表达式左侧的值,可能不会在右侧计算右侧全部。
对于表达式a || b
,如果a
不为零,则a || b
的结果为{{1}的值的1 },因此不会评估b
。对于表达式b
,如果a && b
为零,则a
的结果为零,而与a && b
的值无关,因此不评估b
。
在您的情况下,b
的结果为非零,因此不评估++i && ++j
。