ページ 11

論理演算子について

Posted: 2016年2月02日(火) 14:52
by コッペリア
初めまして。初心者のコッペリアと申します。

以下のプログラムの出力内容の理由がわかりません…
どなたかわかりやすく解説お願いしますm(_ _)m

コード:

#define PRINT(x,y,z) printf("%d\t%d\t%d\n",x,y,z)

int main()
{
 int x,y,z;

 x=y=z=1;
 ++x || ++y && ++z; PRINT(x,y,z);
 
 x=y=z=1;
 ++x && ++y || ++z; PRINT(x,y,z);

 x=y=z=1;
 ++x && ++y && ++z; PRINT(x,y,z); 
}


Re: 論理演算子について

Posted: 2016年2月02日(火) 18:22
by non
JISによると
6.5.13 論理 AND 演算子
(抜粋)
ビット単位の 2 項&演算子と異なり,&&演算子は左から右への評価を保証する。第 1 オペランドの評価
の直後を副作用完了点とする。第 1 オペランドの値が 0 と比較して等しい場合,第 2 オペランドは評価し
ない。
6.5.14 論理 OR 演算子
ビット単位の|演算子と異なり,||演算子は左から右への評価を保証する。第 1 オペランドの評価の直
後を副作用完了点とする。第 1 オペランドの値が 0 と比較して等しくない場合,第 2 オペランドは評価し
ない。
と書かれてます。
つまり
++x || ++y && ++z の場合
評価は左から行われるので、++x が評価され2になるので0以外であり、次の演算子が||なのでそれ以降の評価がされません。
++x && ++y || ++z の場合
、++x が評価され2になるので0以外であり、次の演算子が&&なので、その次の++yが評価されて2になり、次の演算子が||なのでそれ以降は評価されません。

Re: 論理演算子について

Posted: 2016年2月02日(火) 19:42
by みけCAT
コッペリア さんが書きました:以下のプログラムの出力内容の理由がわかりません…
出力内容はコンパイルエラー、理由はあってはいけない場所に全角スペースがあるからですね。
また、printf関数の宣言もその宣言を含むヘッダのincludeも無いのもまずいでしょう。

Re: 論理演算子について

Posted: 2016年2月02日(火) 19:55
by コッペリア
nonさん、ありがとうございました!
わかりやすい解説で理解することができました!

みけCATさん、ありがとうございました。
そうですよね。
課題なんですが、こんな感じで出されるんです…
おかしいですよね…