[英]What are the historical reasons C languages have pre-increments and post-increments?
[英]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
,在声明之后发生了两个后增量?
根据C99 和 C11,两者中的附录C,在调用所有参数并且在&&
运算符的第一个操作数的末尾之后,在调用函数时有一个序列点。
所以你受到双重保护,或者正如我们在澳大利亚所说的那样,如果鲨鱼没有得到你,鳄鱼会(a) 。
标准的两次迭代之间的措辞略有不同,但它们具有相同的效果。 C11一个(为了便于阅读,略微改述):
C11:
以下是前面描述的序列点:
- 在函数调用和实际调用中的函数指示符和实际参数的评估之间。
- 在以下运算符的第一个和第二个操作数的评估之间:
'&&' '||' '?' ','
'&&' '||' '?' ','
'&&' '||' '?' ','
。
&&
的短路特性也意味着将首先评估表达式的左侧 。
所以你的代码片段定义明确,输出结果为01
。
(a)实际上,我不认为澳大利亚的任何人都可能会说,除了史蒂夫欧文,他既不是鲨鱼也不是鳄鱼,并且可能会欣赏这种讽刺。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.