1

那么对于两个单独的代码片段,为什么增量器/减量器的行为不同?

片段 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布尔表达式中使用的事实有关。但这两种情况在我看来是矛盾的。这里发生了什么?

4

4 回答 4

7

好的,您将需要非常仔细地查看运算符优先级的排列方式以及它们的工作方式。由于这是家庭作业,我不会给出确切的答案,但你应该做两件事。

  1. 使用优先表重写带有全括号的表达式
  2. 查找 的确切行为&&。特别是,何时j++ > k执行子表达式?
于 2012-05-17T00:52:31.070 回答
2

这叫短路。当 && 的左手计算为假时,右手边不再执行(跳过)。

于 2012-05-17T00:52:50.390 回答
1

您在此处发生短路 (&&)。仅计算表达式的左侧。

于 2012-05-17T00:53:11.840 回答
0

片段 A:

">" 的优先级高于 "&&",所以

printf("%d\n", i - 7 && j++ > k); 

像这样:

printf("%d\n", i - 7 && (j++ > k));

而“&&”是短路运算,因为(i - 7) == 0,是FALSE,所以(j++ > k)会被忽略,这三个数都不会改变。

片段 B:

"i--" 会先返回原来的值,然后减一。

于 2012-05-17T02:27:43.543 回答