因此,对于两个单独的代码片段,为什么递增器/递减器的行为不同?
片段A:
i=7; j=8; k=9;
printf("%d\n", i - 7 && j++ > k);
printf("%d %d %d", i, j, k);
将产生以下输出:
0
7 8 9
片段B:
while (i > 0)
printf("T minus %d and counting\n",i--);
产生这个:
T minus 5 and counting
T minus 4 and counting
T minus 3 and counting
T minus 2 and counting
T minus 1 and counting
现在,我知道函数的参数是按值传递的,并且它必须与在布尔表达式中使用j
的事实有关。但这两种情况似乎与我相矛盾。这是怎么回事?
答案 0 :(得分:7)
好的,您需要仔细查看非常运算符优先级如何排列和的确切方式。由于这是作业,我不打算给出确切的答案,但你应该做两件事。
&&
的完全行为。特别是,子表达式j++ > k
何时执行?答案 1 :(得分:2)
这叫做短路。左右的&&评估为falsy右侧不再执行(跳过)。
答案 2 :(得分:1)
这里有短路(&&)。 只评估表达式的左侧。
答案 3 :(得分:0)
片段A:
“>” 中优先于“&&&”,所以
printf("%d\n", i - 7 && j++ > k);
像这样:
printf("%d\n", i - 7 && (j++ > k));
和“&&”是一个短路操作,因为(i - 7)== 0,为FALSE,所以(j ++> k)将被忽略,所有这三个数字都不会改变。
片段B:
“i--”将首先返回原始值,然后减去一个。