【发布时间】:2017-06-01 18:16:21
【问题描述】:
https://kukuruku.co/post/i-do-not-know-c/
问题 #7:
#include <stdio.h>
void f(int *i, long *l)
{
printf("1. v=%ld\n", *l); /* (1) */
*i = 11; /* (2) */
printf("2. v=%ld\n", *l); /* (3) */
}
int main()
{
long a = 10;
f((int *) &a, &a);
printf("3. v=%ld\n", a);
return 0;
}
小端系统上两个不同编译器的输出是:
1. v=10 2. v=11 3. v=11
1. v=10 2. v=10 3. v=11
第二个结果怎么可能?我不太明白通过引用严格别名来解释结果的解释。编译器是否完全忽略第 (2) 行?
【问题讨论】:
-
这是未定义的行为。 更新:顺便说一句,看了这篇文章,它是关于未定义的行为。你读过吗?
-
我猜你的编译器 2(不管它可能是什么)可能正在做一些
premature optimization -
@Zakir 编译器不易受到过早优化....
-
@Zakir “过早优化”是什么意思?
标签: c pointers language-lawyer strict-aliasing type-punning