c++でif文が省略された(?)引数

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

c++でif文が省略された(?)引数

#1

投稿記事 by outama » 2年前

サンプルプログラムを見たら見たことない書き方をしたところがありました。
以下のコードはそれをまねて書いたものです。

コード:

int a = 0 , b = 0;  
func( a , (b == 0)  |  (b == 3));
質問なのですが、
第二引数はどのような意味でしょうか・
ご指導お願いします。

MEMO A

Re: c++でif文が省略された(?)引数

#2

投稿記事 by MEMO A » 2年前

(b == 0)・・・bが0の時にTRUE(1)になる。それ以外はFALSE(0)。
(b == 3)・・・bが3の時にTRUE(1)になる。それ以外はFALSE(0)。

int a = 0 , b = 0;
とあり、bは0なので、

(b == 0)→1
(b == 3)→0

なので、上記は「1|0」と同等の結果になると言えるため、
(b == 0) | (b == 3)
は1になると思います。

outama

Re: c++でif文が省略された(?)引数

#3

投稿記事 by outama » 2年前

ありがとうございます。論理値だったのですねー、勉強になりました!

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

Re: c++でif文が省略された(?)引数

#4

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

MEMO A さんが書きました:(b == 0)・・・bが0の時にTRUE(1)になる。それ以外はFALSE(0)。
(b == 3)・・・bが3の時にTRUE(1)になる。それ以外はFALSE(0)。
C++では、比較演算子の結果は整数ではなく、bool型のtrueまたはfalseです。 (N3337 5.9, 5.10)
ビットOR演算子は整数(かunscoped enumeration : enum classやenum structではなくenumで宣言された列挙型)でないといけない(N3337 5.13)ので、
この場合bool型のオペランドがint型に変換されて計算されるのだと思います。
boolからintの変換は、falseが0に、trueが1に変換されます。(N3337 4.7)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

YuO
記事: 940
登録日時: 8年前
住所: 東京都世田谷区

Re: c++でif文が省略された(?)引数

#5

投稿記事 by YuO » 2年前

ifが省略されたわけではないです。
bool型に|演算子を使うのは珍しいですが……。

|演算子 : 式「(b == 0) | (b == 3)」は式「(b == 0)」の結果と式「(b == 3)」の結果のビットごとの論理和を計算します。
==演算子 : 式「b == 0」はbが0に等しければtrueを,そうでなければfalseを式の値にします。
==演算子 : 式「b == 3」はbが3に等しければtrueを,そうでなければfalseを式の値にします。
さて,面倒なことに|演算子を使っているため,|演算子の両辺がint型に変換されます。
この時,trueは1に,falseは0になります。
そして,それらのビットごとの論理和を取るため,結果として,「bが0か3であれば式の値は1,そうでなければ0」となります。

ちなみ,||演算子を使っていた場合,両辺がbool型に変換される(今回の場合は元々bool型なので変換はない)ので,「bが0か3であれば式の値はtrue,そうでなければfalse」となります。

outama

Re: c++でif文が省略された(?)引数

#6

投稿記事 by outama » 2年前

みけCATさんYuOさんありがとうございます。
論理和の演算をしているためint型になっているということですね。理解しました(c++むつかしい・・・)

返信

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