論理演算子について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
コッペリア

論理演算子について

#1

投稿記事 by コッペリア » 9年前

初めまして。初心者のコッペリアと申します。

以下のプログラムの出力内容の理由がわかりません…
どなたかわかりやすく解説お願いします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); 
}


non
記事: 1097
登録日時: 14年前

Re: 論理演算子について

#2

投稿記事 by non » 9年前

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になり、次の演算子が||なのでそれ以降は評価されません。
non

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 論理演算子について

#3

投稿記事 by みけCAT » 9年前

コッペリア さんが書きました:以下のプログラムの出力内容の理由がわかりません…
出力内容はコンパイルエラー、理由はあってはいけない場所に全角スペースがあるからですね。
また、printf関数の宣言もその宣言を含むヘッダのincludeも無いのもまずいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

コッペリア

Re: 論理演算子について

#4

投稿記事 by コッペリア » 9年前

nonさん、ありがとうございました!
わかりやすい解説で理解することができました!

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

閉鎖

“C言語何でも質問掲示板” へ戻る