ページ 11

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

Posted: 2017年8月22日(火) 00:39
by outama
サンプルプログラムを見たら見たことない書き方をしたところがありました。
以下のコードはそれをまねて書いたものです。

コード:

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

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

Posted: 2017年8月22日(火) 00:58
by MEMO A
(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になると思います。

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

Posted: 2017年8月22日(火) 01:03
by outama
ありがとうございます。論理値だったのですねー、勉強になりました!

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

Posted: 2017年8月22日(火) 01:06
by みけCAT
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)

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

Posted: 2017年8月22日(火) 01:11
by YuO
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」となります。

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

Posted: 2017年8月22日(火) 01:42
by outama
みけCATさんYuOさんありがとうございます。
論理和の演算をしているためint型になっているということですね。理解しました(c++むつかしい・・・)