ガチガチに環境依存なコードなので移植性はありません。大事なのは6行目です。(ポインタ型を強制的に別のポインタ型に解釈できる)で無理矢理char型に再解釈して、char型の値を代入しています。これにより内部が00000010というbool型の出来上がりです。シンプルですが無茶苦茶です。(もしreinterpret_castを使わないで素直に代入しようとすると、C++の通常の型システムにより「この操作はbool型に変換して代入するんだな」ということで正しい変換が行われて代入されてしまいます。)最後のところ、b1の否定で何が起きてるのか知りたい場合はc1を出力させればわかります。(=00000011)となっており、否定の操作が下位1bitの反転という振る舞いであることがわかります。値のコピーにより修正されないため関数の戻り値にすることもできます。trueこういう関数を誰かのコードにこっそり仕組んでやれば邪悪な嫌がらせができますね。邪悪さアップ作戦このコードにも欠点があって、最適化を施すとコンパイル時最適化が働いて正しいbool型変数になってしまうことです。trueこの場合は変数をvolatile(変数が任意のタイミングで勝手に変わりうるという宣言)にすることで、目的のコードが静的に最適化できなくなるため解決(?)します。0;}これで邪悪さは保証されます。clangの高い壁さて、ここまで書いたコードもclang/LLVMの前にはまったく効き目がありません。trueあれれ、見透かされてる?どうしてこんなことになるのかは、オブジェクトファイルを逆アセンブルしてみればわかります。$0x1,%ecxなんと、下位1bitをxorで反転した後にきちんと上位n-1bitをandで0にされています。clang!当然こういう作業が入るぶん動作は遅くなります。試しにbool型の代入をしこたま繰り返すfor文を書いて速度をとってみましたが、clangのほうが1割程度遅い結果となりました。clangはまだgccより動作が多少遅い場合もあるとされていますが、こういう違いもあるようですね。今回のようなコードは意図して書かないとできないわけですが、万が一自然にこんな結果が出てしまった日には(自分含む)ゆるプログラマーは絶望に襲われることでしょう。普段からきれいなコードを書くことは重要ですね、と、適当に綺麗な結論で締めくくりにしたいと思います。コメントをキャンセルメールアドレスが公開されることはありません。(9)著者について工学系の大学院生です。このブログについて」のページをどうぞ。