Cで左辺のキャストで質問
■ このスレッドは過去ログ倉庫に格納されています
0001厨房エログラマ
NGNG(unsigned char)a = 0xff;
このようなコードをみました。
VC++で試したところ、拡張子CPPではエラーになりましたが、
拡張子Cでは問題なく通り、aの値は 0xccccccff になりました。
この代入はC言語の規則上では正しいのでしょうか?
0002名無しさん@お腹いっぱい。
NGNG0003名無しさん@お腹いっぱい。
NGNG0004名無しさん@お腹いっぱい。
NGNGこう書くのが正しい。
0005名無しさん@お腹いっぱい。
NGNG0006名無しさん@お腹いっぱい。
NGNGa |= (unsigned long)0xff
ですかね。
0007名無しさん@お腹いっぱい。
NGNGキャストする必要ないだろ??
0008ビル・ジョブス
NGNGC言語仕様からみれば正しい。
しかし、特別な理由が無い限りやってはいけない記述である。
特別なケースとしては処理系依存する話だが、構造体のメンバ
の順序が決まっていて、一部のメンバにアライメント境界が
必要な場合くらいだ。それも、unionで対応できるケド...
後はC言語の精神に反するがあえて処理系依存したい場合だな。
0009>8
NGNG言語仕様というからにはANSI、百歩譲ってK&Rだよな
0010>8
NGNGは置けない。これはANSIでは「処理系依存」ではない。
この記述ができるコンパイラはANSIに従っていない。このため
VC6も-ZaでこのMS拡張仕様を無効にする手段を用意している。
gccではコンパイルできるが結果は0xccccccffでなく
0x000000ffになる。同様に-ansi -pedanticをつけて厳格に
ANSIに準拠させるとエラーとなる。
言語仕様を(暗記せよとはいわないが)調べるぐらいしたら
001110>1
NGNGなったんだ???
0012名無しさん@お腹いっぱい。
NGNG001310
NGNG0014厨房エログラマ
NGNG>11
かなーり前からです。
2chのみなさんありがとう。
001510
NGNGchar* p;
*((long*)p)++ = 0;
も(long*)pは左辺値でないので、厳密にはエラー。
*(long*)p = 0;
(long*)p = (long*)p + 1;
と置き換えてみると、それが顕著になる。
(char)a = 0xff;
ほどエキセントリックではないが、逆に言語仕様と思っている人が
多くて始末が悪い。。
0016名無しさん@お腹いっぱい。
NGNG0017>16
NGNG0018>17
NGNG共用体はさまざまな型を内包可能な型を作る場合にも使われる。
ちゅうかそっちが主な目的だろ。
■ このスレッドは過去ログ倉庫に格納されています