39829


x = 2, y = 1, z = 0 のとき、

[code]

    cout<< “answer =” <<(x||!y&&z)<< endl;
    
[/code]

がどのように出力されるかについての質問です。

出力してみると、answer = 1となるのですが、なぜこのような結果となるかご教示いただけますと幸いです。


CC BY-SA 3.0
2017-11-25T13:07:24.507
39827
2018-01-23T01:21:40.557
2018-01-23T01:21:40.557
19110
26303
question
c++
C++で異なる論理演算子を同時に使ったときの挙動が理解できない


演算子には下記サイトにあるような優先順位があります。  
ここを手がかりに、式`(x||!y&&z)`の`||`と`!`と`&&`が評価される順番を整理してみてはいかがでしょうか。

<https://msdn.microsoft.com/ja-jp/library/126fe14k.aspx>


CC BY-SA 3.0
2017-11-25T13:41:52.690
39829
2017-11-25T13:41:52.690
26311
39827
answer


演算子の優先順位は

`!` > `&&` > `||`

です。なので

> !y
>

>> false

>
> !y && z
>

>> false

>
> x || !y && z
>

>> true

となります。つまり

> (x || ((!y) && z))

ですね。

なお GCCで`-Wall -Wextra`をつけてコンパイルすると

[code]

    prog.cc: In function 'int main()':
    prog.cc:10:31: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
         cout<< "answer =" <<(x||!y&&z)<< endl;
                                 ~~^~~
    
[/code]

のように怒られます。またClangで同様に`-Wall -Wextra`をつけてコンパイルすると

[code]

    prog.cc:10:31: warning: '&&' within '||' [-Wlogical-op-parentheses]
        cout<< "answer =" <<(x||!y&&z)<< endl;
                              ~~~~^~~
    prog.cc:10:31: note: place parentheses around the '&&' expression to silence this warning
        cout<< "answer =" <<(x||!y&&z)<< endl;
                                  ^
                                (    )
    1 warning generated.
    
[/code]

のように怒られます。実に親切なエラーメッセージですね！


CC BY-SA 3.0
2017-11-25T13:49:27.223
39830
2017-11-25T13:49:27.223
2020-06-17T08:14:45.997
-1
23941
39827
answer