2017-02-19 88 views
0

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

回答

4

它是未定義的行爲修改const變量。它可能是這樣的:

*pi = 2; 

將您的整數設置爲9999.或者崩潰程序。

即使您編譯完程序,如果您運行了四次並得到四個不同的結果,您將無法投訴。這是未定義行爲的美妙之處。

相關問題