C操作顺序

时间:2012-05-17 00:47:52

标签: c scope printf operator-precedence

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

片段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 个答案:

答案 0 :(得分:7)

好的,您需要仔细查看非常运算符优先级如何排列的确切方式。由于这是作业,我不打算给出确切的答案,但你应该做两件事。

  1. 使用优先表
  2. 重写带有完整括号的表达式
  3. 查看&&完全行为。特别是,子表达式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--”将首先返回原始值,然后减去一个。