为什么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 

我想知道:

  1. C和C++中'const'的含义有点不同,所以相同编译器gcc的结果可能导致不同的结果?
  2. 编译相同的.c文件,gcc和clang有不同的结果,这是正确的,或者这是未定义的行为?任何C/C++标准语句都可以解释这一点?
+4

修改常量变量是UB。这也曾被问过很多次。 – milleniumbug

它是未定义的行为修改const变量。它可能是这样的:

*pi = 2; 

将您的整数设置为9999.或者崩溃程序。

即使您编译完程序,如果您运行了四次并得到四个不同的结果,您将无法投诉。这是未定义行为的美妙之处。