2016-11-12 2 views
0

このコードビット演算子をストリームで直接使用できないのはなぜですか?

#include <iostream> 
using namespace std; 
int main() { 
    short int a = 0xFFFD, b = 10; 
    cout << a | b; 
    return 0; 
} 

を実行しようと、私はエラー

エラーだものの:のための一致なし '演算子を|'

しかし、別の変数に結果を格納することは、問題を解決するためのようだ:

#include <iostream> 
using namespace std; 
int main() { 
    short int a = 0xFFFD, b = 10, c; 
    c = a | b; 
    cout << c; 
    return 0; 
} 

誰かが私に理由を説明してもらえますか?

+0

これは、ooperatorの優先順位のためです。 –

+0

'cout <<(a | b);'余分な変数は必要ありません。うまく配置された括弧のペアだけです。 –

+1

http://en.cppreference.com/w/cpp/language/operator_precedence –

答えて

3
cout << a | b; 

の左オペランドにこれはと同等です本当。

適切な場所に括弧を置くことによって、あなたの表現を修正:

cout << (a | b); 

(独自の変数に事前保存a | bは、同様の効果があります。)

をはい、これはここではわかりにくいですが、それです<<はその基本的な意味の「ビット左シフト」から「再使用」されており、その基本的な意味のために当初はの優先度が|であり、<<よりも小さいと決定されました。

3

問題は、ビットごとの演算子|シフト演算子に比べて優先順位が低くなります。

したがって、この文

cout << a | b; 

(cout << a) | b; 

文と同じですし、何のオーバーロード演算子はありません|エラーメッセージの残りの部分を読めば、あなたはある、そこにはoperator|(ostream&, short int)をあなたに言っていないということがわかります

(cout << a) | b; 

:タイプstd::osteram

関連する問題