2016-04-10 5 views
4

1)論理演算子による代入がない理由は、和と差による代入ですか?なぜC/C++では論理演算子(&& =と|| =)による代入が欠けていますか?

bool a = true; 
bool b = false; 
a = a || b; 
a ||= b; // syntax error! 
a |= b; // OK. 

2)ブール変数に対してビット単位の演算子を適用するの意味は何ですか? 論理演算子を使用するのと同じですか?

+1

あなたの質問に言い換えてください。あなたの言うことがよくわかりません? – haccks

+3

@haccks彼は複合ブール代入演算子がない理由を尋ねています。 '|| =' '&& =' – bolov

+1

適切な質問をしてください。現在、なぜ「|| =」、「&& = 'etc」がないのか、あるいは「ブール変数にビット単位の演算子を適用するのはどういう意味ですか?」と質問するかどうかは不明です。 –

答えて

2

a |= bは、aのアドレスが1回だけ評価されることを除いて、a = (a | b)と同じ意味です。その後、昇進の規則とboolへの割り当てのルールを調べます。

+1

ブール演算子でビット演算子を使用できますか? – Sanich

2

C言語では、これらの複合文ではない有効な構文で

*= /= %= += -= <<= >>= &= ^= |= 

||=することができます。

Cのboolは整数型です。 true1であり、false0である。ビット演算子はboolに適用できます。

+3

'|| ='と '&& ='は違法ですが、なぜ良い質問でしょうか。 – HolyBlackCat

+0

@ M.M;うん。ただ考え出した。 – haccks

+0

'bool'はそれ自身の型です。これは整数型ですが、 'int'と同じではありません。 –

3

&&=||=がCから「欠落している」のは本当です.1つの理由は、Cの論理ANDとORが短絡を実行するということです。これは省略形で少し奇妙です。しかし、その代わりにビット単位の代入演算子を使用しないでください。代わりに、次のように書いてください:

a = a && b; 
c = c || d; 

標準的な真偽値(1と0)がある場合は、ビット演算子が動作します。しかし、5や2のような非正規の値に適用すると、異なる結果が得られます(5 & & 2は1ですが、5 & 2は0です)。

+0

「短絡」とは何ですか? – Sanich

+0

Cのbool型はいつも正規ですか? – Sanich

+2

'&&'と '|| 'を短絡することは、結果を決定する必要がある場合にのみ第2オペランドが評価されることを意味します。例えば、あなたが '0 && x'を持っていれば、' x'は評価されません。これはあなたがすでに答えが '0'であることを知っているからです。同様に、 '1 || y 'の場合、答えが '1'であることを既に知っているので、' y'は評価されません。これは、第2オペランドが評価が遅い場合(例えば、関数呼び出し)、または副作用がある場合に重要である。 –

関連する問題