基于这篇非常好的博客文章,严格的别名情况非常糟糕,我已经将这段代码放在网上供您测试:
http://cpp.sh/9kht(输出在-O0和-O2之间变化)
#include <stdio.h>
long foo(int *x, long *y) {
*x = 0;
*y = 1;
return *x;
}
int main(void) {
long l;
printf("%ld\n", foo((int *)&l, &l));
}
Run Code Online (Sandbox Code Playgroud)
这里有某种未定义的行为吗?
当我们选择-O2级别时,内部会发生什么?