2017-02-19 4 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 

私は.cppファイル、およびそれをコンパイルして実行する++グラム使用する.Cからファイルを変更した場合、結果が打ち鳴らすと同じですバージョン

$g++ testConst.cpp && ./a.out 
i = 1 *pi = 2 
j = 1 

私が知りたい:

  1. CとC++の 'const'の意味は少し違うので、同じコンパイラgccの結果は異なる結果につながりますか?
  2. 同じ.cファイルをコンパイルすると、gccとclangの結果は異なりますが、これは正しいですか?これは未定義の動作ですか?これを説明できるC/C++標準ステートメント
+4

const変数の変更はUBです。またこれは以前に何度も尋ねられてきました。 – milleniumbug

答えて

4

未定義の動作constの変数を変更します。

*pi = 2; 

整数を9999に設定するか、プログラムをクラッシュさせます。

プログラムをコンパイルしても、4回実行して4つの異なる結果が得られれば、不平を言うつもりはありません。それは未定義の振る舞いの美しさです。

関連する問題