我正在使用gcc和clang测试.c和.cpp下“const”关键字的行为。
#include<stdio.h>
int main(){
const int i=1;
int *pi = (int *)(&i);
*pi = 2;
printf("i = %d *pi = %d\n",i,*pi);
const int j=i;
printf("j = %d\n", j);
return 0;
}
使用不同的编译器会产生不同的结果:
$gcc testConst.c && ./a.out
i = 2 *pi = 2
j = 2
$clang testConst.c && ./a.out
i = 1 *pi = 2
j = 1
如果我将文件从.c更改为.cpp,并使用g ++编译并运行它,那么结果与clang版本相同
$g++ testConst.cpp && ./a.out
i = 1 *pi = 2
j = 1
我想知道:
答案 0 :(得分:4)
修改const
变量是未定义的行为。它甚至可能是这样的:
*pi = 2;
将整数设置为9999.或者使程序崩溃。
即使你已经编制了这个程序,如果你运行它四次并获得四个不同的结果,你就没有理由抱怨。这是未定义行为的美妙。