トップ «前の日記(2017-10-22) 最新 次の日記(2017-10-28)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2017-10-24

_ Cのconst変数

clangで試してみる。
const int x = 8;
printf("x=%i\n", x); // => 8
// x = 9; //=> error: read-only variable is not assignable
int *p = (int*)&x;
*p = 32;
printf("x=%i\n", x); // => 8   WHY?!
printf("x=%i\n", *p); // => 32
printf("p=%p, &x=%p\n", p, &x); // => p=0x7fffdcd666bc, nm=0x7fffdcd666bc

コンパイルエラーにはならないし、実行もできる。pと&xは同じアドレスをポイントしている。しかし、xと、*pは異なる値を出す。
おそらく、printf("x=%i\n", x);は即値を使うコードを生成しているのではなかろうか(-Sして確かめれば良いが面倒だな)。

と思いながら-Sしてみたらびっくり。

printf("x=%i\n", 8);
printf("x=%i\n", 32);

が生成されていた。-Oなんか付けてないのになぁ。

本日のツッコミ(全3件) [ツッコミを入れる]
_ shiro (2017-10-24 05:03)

trivialな定数伝搬は無条件でやっちゃうわけですね。後のパスでさらに定数を畳み込むのに早いうちにやっときたいというのはわかる気が。&xからキャストでconst外して代入するのはどっちにせよUndefined Behaviorだと思うので、コンパイラはどんなコードを生成しても良いはず。

_ arton (2017-10-24 23:19)

ああ、なるほど。C11の6.7.3.6のここかな。 <br>If an attempt is made to modify an object defined with a const-qualified type through use <br>of an lvalue with non-const-qualified type, the behavior is undefined.

_ arton (2017-10-24 23:29)

それにしても、高級アセンブラの面影は全然ないな……


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|

ジェズイットを見習え