根据优化级别,输出的不同之处如下:
意外输出:
$ gcc -Wall -O3 otest.c -o otest
$ otest
*x: 0
y: 2048.899902
y: 0.000000
预期产出:
$ gcc -Wall -O2 otest.c -o otest
$ otest
*x: 45000e66
y: 0.000000
y: 2048.899902
源代码:
#include <stdio.h>
int main(void)
{
float y = 2048.9;
void *p = &y;
unsigned int *x = p;
printf(" *x: %x \n",*x);
*x = 0;
printf(" y: %f \n",y);
*x = 0x45000e66;
printf(" y: %f \n",y);
return 0;
}
gcc版本是4.2.1。
我错过了任何重要指令吗?
答案 0 :(得分:4)
是。您的代码违反了严格别名规则(当您有float
但是通过指向unsigned int
的指针访问它时,这是一种不兼容的类型),调用未定义的行为,因此允许编译器用你的代码做任何你喜欢的事情,包括完全消除它的一部分。