为什么gcc和clang编译为我的程序不同的“const”结果?
问题描述:
我正在使用gcc和clang测试.c和.cpp下的“const”关键字的行为。为什么gcc和clang编译为我的程序不同的“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 ++编译和运行它,那么结果是一样的铛版本
$g++ testConst.cpp && ./a.out
i = 1 *pi = 2
j = 1
我想知道:
- C和C++中'const'的含义有点不同,所以相同编译器gcc的结果可能导致不同的结果?
- 编译相同的.c文件,gcc和clang有不同的结果,这是正确的,或者这是未定义的行为?任何C/C++标准语句都可以解释这一点?
答
它是未定义的行为修改const
变量。它可能是这样的:
*pi = 2;
将您的整数设置为9999.或者崩溃程序。
即使您编译完程序,如果您运行了四次并得到四个不同的结果,您将无法投诉。这是未定义行为的美妙之处。
修改常量变量是UB。这也曾被问过很多次。 – milleniumbug