包含函数调用和 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 , 既没有被鲨鱼也没有被鳄鱼抓住,并且可能会欣赏这样的讽刺。
下面的代码打印的是什么?
#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 , 既没有被鲨鱼也没有被鳄鱼抓住,并且可能会欣赏这样的讽刺。