著作一覧 |
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なんか付けてないのになぁ。
ジェズイットを見習え |
trivialな定数伝搬は無条件でやっちゃうわけですね。後のパスでさらに定数を畳み込むのに早いうちにやっときたいというのはわかる気が。&xからキャストでconst外して代入するのはどっちにせよUndefined Behaviorだと思うので、コンパイラはどんなコードを生成しても良いはず。
ああ、なるほど。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.
それにしても、高級アセンブラの面影は全然ないな……