none
C#の論理ANDと条件ANDの違いを教えてください RRS feed

  • 質問

  • 初歩的な質問ですみません。

    C#の文法を再勉強していますが、
    C#の論理ANDと条件ANDの違いがわかりません。
    両者の違いを教えていただけないでしょうか。

    よろしくお願いします。
    2009年5月6日 6:16

回答

  • if 文などで、上記の A, Bの両方についての評価が必要な場合、 A && Bと書いたほうが
    実行速度が速くなる、という理解でよろしいですか?
    「両方の評価が必要」という意味合いによります。

    単純に、if (A & B)と、if (A && B)のどちらが良いかという話であれば、後者の&&演算子が良いでしょう。
    Aが偽ならば、Bは評価されない分、実行速度は改善します。(程度の差はありますが)

    「両方について評価が必要」を字面通り受け取って、AとBを必ず実行した上で、その結果の論理積を得たいのであれば、&演算子でしょう。
    実行速度云々ではなく、「評価が必要」という要求なのですから、評価しないとだめなんですよね?
    &&演算子だと、Aが偽の場合に、Bが評価(実行)されない分、「評価が必要」という前提を満たせなくなりますので。


    # 「評価」という言葉の意味が重要です。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク なっぷ 2009年5月6日 8:22
    2009年5月6日 7:41
    モデレータ
  • 触れられていなかったので、念のため。
    &演算子も&&演算子もbool値に対するlogical andができますが、&演算子にはもうひとつ、int値に対するbitwise andがあります。一般的にはこちらの用途に使われます。
    • 回答としてマーク なっぷ 2009年5月6日 8:22
    2009年5月6日 7:57

すべての返信

  • C#の論理ANDと条件ANDの違いがわかりません。
    両者の違いを教えていただけないでしょうか。
    & 演算子と && 演算子のことですか?
    http://msdn.microsoft.com/ja-jp/library/sbf85k1c.aspx
    http://msdn.microsoft.com/ja-jp/library/2a723cdk.aspx

    A & B と書いた場合、A も B も評価(実行)されます。
    A && Bと書いた場合、Aが真の場合のみBが評価(実行)され、Aが偽の場合はBは評価(実行)されません。


    コンソールアプリケーションのプロジェクトを新規作成して、下記のようなコードを書いてみると分かるかもしれません。


    static bool ReturnTrue()
    {
        Console.WriteLine("ReturnTrue()");
        return true;
    }
    
    static bool ReturnFalse()
    {
        Console.WriteLine("ReturnFalse()");
        return false;
    }
    
    static void Main(string[] args)
    {
        Console.WriteLine("Test operator &");
        bool result = ReturnFalse() & ReturnTrue();
        Console.WriteLine("Test operator &&");
        result = ReturnFalse() && ReturnTrue();
        Console.ReadLine();
    }
    



    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年5月6日 7:21
    モデレータ
  • Azulean様

    ご丁寧な回答ありがとうございます。

    & 演算子と && 演算子のことですか?
    http://msdn.microsoft.com/ja-jp/library/sbf85k1c.aspx
    http://msdn.microsoft.com/ja-jp/library/2a723cdk.aspx

    A & B と書いた場合、A も B も評価(実行)されます。
    A && Bと書いた場合、Aが真の場合のみBが評価(実行)され、Aが偽の場合はBは評価(実行)されません。

    とのことですが、上記のご指摘内容から想像しますと、
    if 文などで、上記の A, Bの両方についての評価が必要な場合、 A && Bと書いたほうが
    実行速度が速くなる、という理解でよろしいですか?

    再度ご回答いただければ幸いです。
    よろしくお願いします。

    2009年5月6日 7:36
  • if 文などで、上記の A, Bの両方についての評価が必要な場合、 A && Bと書いたほうが
    実行速度が速くなる、という理解でよろしいですか?
    「両方の評価が必要」という意味合いによります。

    単純に、if (A & B)と、if (A && B)のどちらが良いかという話であれば、後者の&&演算子が良いでしょう。
    Aが偽ならば、Bは評価されない分、実行速度は改善します。(程度の差はありますが)

    「両方について評価が必要」を字面通り受け取って、AとBを必ず実行した上で、その結果の論理積を得たいのであれば、&演算子でしょう。
    実行速度云々ではなく、「評価が必要」という要求なのですから、評価しないとだめなんですよね?
    &&演算子だと、Aが偽の場合に、Bが評価(実行)されない分、「評価が必要」という前提を満たせなくなりますので。


    # 「評価」という言葉の意味が重要です。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク なっぷ 2009年5月6日 8:22
    2009年5月6日 7:41
    モデレータ
  • 触れられていなかったので、念のため。
    &演算子も&&演算子もbool値に対するlogical andができますが、&演算子にはもうひとつ、int値に対するbitwise andがあります。一般的にはこちらの用途に使われます。
    • 回答としてマーク なっぷ 2009年5月6日 8:22
    2009年5月6日 7:57
  • Azulean 様
    佐祐理様

    みなさまご回答ありがとうございます。

    Azulean様のおっしゃるように評価という意味合いを考えて今後使用します。

    今回の質問は、「C#プログラミング講座(ASCII社)」で文法を再勉強していて、
    &演算子が bit演算的に論理ANDができることが書いてあり、&演算子って
    bool値に対してではなかったっけ?が発端です。
    ここでは、佐祐理様がおっしゃるように、bool型、int型に対しての論理ANDが
    できると1行でさらっと書いてあるだけでした。

    ご回答いただき両者の違いが良くわかりました。
    ありがとうございました。
    また質問の節はよろしくお願いします。
    2009年5月6日 8:21
  • Azuleanさんのコメントされている内容は決して初歩的ではなかったので補足したのですが、bit演算については理解されていましたか。

    なお、質問からは外れますが、「文法を再勉強」なさるのでしたら言語仕様を読まれることをおすすめします。
    "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC#\Specifications\1041\CSharp Language Specification.doc"
    もしくは
    "C:\Program Files\Microsoft Visual Studio 9.0\VC#\Specifications\1041\CSharp Language Specification.doc"
    「1041」とあるように日本語に訳されています。
    一般の書籍ですと著者の判断で記述が省かれたり、内容が間違っていたりしますが、こちらは言語仕様ですので内容に過不足はありません。
    ご質問の内容も7.10~7.11に記載されていることを確認しました。
    2009年5月6日 8:39
  • 佐祐理様

    ご丁寧にありがとうございます。
    言語仕様を今度確認してみます。
    またご教示よろしくお願いします。m(_ _)m

    なっぷ
    2009年5月6日 9:50