为什么gcc和clang会为我的程序编译不同的“const”结果?

时间:2017-02-19 05:22:09

标签: c++ gcc casting clang const

我正在使用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

我想知道:

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

1 个答案:

答案 0 :(得分:4)

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

*pi = 2;

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

即使你已经编制了这个程序,如果你运行它四次并获得四个不同的结果,你就没有理由抱怨。这是未定义行为的美妙。