包含函数调用和 post 增量的表达式中的 C 序列点

C sequence points within expression containing function calls and post-increments

下面的代码打印的是什么?

#include <stdio.h>


int f(int x) { printf("%d", x); return 1; }

int main() {
    int i = 0;
    f(i++) && f(i++);
}

它是否保证是 01,或者它可以是 00 并且两个 post 增量都发生在语句之后?

根据 C99 C11,两者的附录 C,在计算所有参数后,函数调用处有一个序列点 and&& 运算符的第一个操作数的末尾。

所以你受到双重保护,或者,正如我们在澳大利亚所说的那样,如果鲨鱼不抓住你,鳄鱼就会(a).

标准的两次迭代之间的措辞略有不同,但它们具有相同的效果。 C11 是(为了便于阅读而稍微改写):

C11:

The following are the sequence points described earlier:

  • Between the evaluations of the function designator and actual arguments in a function call and the actual call.
  • Between the evaluations of the first and second operands of the following operators: '&&' '||' '?' ','.

&& 的短路性质也意味着表达式的 left 手边将首先计算。

因此您的代码段定义明确,输出将为 01


(a) 实际上,我认为澳大利亚的 任何人 都不会这么说,除了 Steve Irwin , 既没有被鲨鱼也没有被鳄鱼抓住,并且可能会欣赏这样的讽刺。