無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

Dをつつく15-論理演算。バイナリの必須アイテム。

今回は論理演算に関する確認ピヨ。「Cとどうせ同じだろ?」と思う人もいるだろうけど油断大敵。 多言語を学習するとたまに混乱するから確認だけしておいてメモしておこう。 そうした地道な積み重ねが技術者としての力を生むんだ。
という事でコードを見てね。


import std.stdio;

int main( char[][] ) {
    bool x;
    bool y;

    //Or演算
    x = true;
    y = false;
    writeln( "x = ", x, "y = ", y, "のOr演算の結果は?\t", x | y );
    x = false;
    y = false;
    writeln( "x = ", x, "y = ", y, "のOr演算の結果は?\t", x | y );
    x = true;
    y = true;
    writeln( "x = ", x, "y = ", y, "のOr演算の結果は?\t", x | y );
    writeln( "" );

    //And演算
    x = true;
    y = false;
    writeln( "x = ", x, "y = ", y, "のAnd演算の結果は?\t", x & y );
    x = false;
    y = false;
    writeln( "x = ", x, "y = ", y, "のAnd演算の結果は?\t", x & y );
    x = true;
    y = true;
    writeln( "x = ", x, "y = ", y, "のAnd演算の結果は?\t", x & y );
    writeln( "" );

    //Xor演算
    x = true;
    y = false;
    writeln( "x = ", x, "y = ", y, "のXor演算の結果は?\t", x ^ y );
    x = false;
    y = false;
    writeln( "x = ", x, "y = ", y, "のXor演算の結果は?\t", x ^ y );
    x = true;
    y = true;
    writeln( "x = ", x, "y = ", y, "のXor演算の結果は?\t", x ^ y );
    writeln( "" );
    
    return 0;
}


これで確認OKピヨ。でもこれだけじゃ面白くないから1つ面白い事を教えるピヨ。
このプログラムの文字列以外のところに 全角スペースを使ってみて。 どう?珍しいエラーが出たでしょう。
これは何かというと。文字コードに関するトラブルなんだ。 Dコンパイラのソースを見たところ、 0x3eで始まるUNICODE文字はスキャナでANSI文字列と見なされて その結果、Lexerのscanメソッドの
if (isprint(c)) 
error("unsupported char '%c'", c); 
else 
error("unsupported char 0x%02x", c); 
p++; 
continue; 
} 

の部分でエラーを出力されるピヨッ。 その理由はANSIでは<にあたるからなんだ。 なお、UNICODE−8では先頭バイト00-7FはANSIの制御文字に当たるんだよ。
だから 全角スペースを使用したら絶対に駄目。 でもこれはパーサーのプログラムミスだと思うピヨね。 パーサーがちゃんと全角スペースを取り除いていればこの部分へ到達する事は無い筈。 もしかしたらそうしない理由があるのかもしれないけどね。
別窓 | D | コメント:0 | トラックバック:0 | ∧top | under∨
<<このブログの案内 | 無差別に技術をついばむ鳥 | Dをつつく14−比較演算。平等だけじゃ駄目!時には比べる事も大事。>>

この記事のコメント

∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

∧top | under∨
| 無差別に技術をついばむ鳥 |