2017-05-16 10 views
-2

どのようにコンパイラは、次の場合を区別しない:正しいブラケットなしのCOUTと< <がために常にあるようだとして、コンパイラの自己前提としてほとんどの場合にはCPPエラーで<<演算子

cout << a; //Case 1 :prints a 

cout << a << b; // Case 2 :prints both a and b 

cout << (a << b); // Case 3 :Left shifts a by b bits and prints shifted a 

cout << a&b; // Case 4 :Throws an ERROR 

出力ストリームにを挿入する。。しかし、なぜ最後のケースで失敗するのですか?IMO:これは適切にビットごとにbの答えを与えたはずです。エラーが4の場合には発生しないのはなぜ

cout<< (a&b); //gives correct output of bitwise and a , b. 

:私はブラケティングなければ、それは正しいとなりますでしょうか?

+4

C++オペレータ優先順位の[参照](http://en.cppreference.com/w/cpp/language/operator_precedence)をご覧ください:) – George

+1

これは演算子の優先順位によるものです。また、左と右の引数を受け入れる '<<'のような二項演算子の概念もあります。 'cout'では' cout'を返して、途中で続けることができます。しかし、演算子の優先順位が間違っている場合... – AndyG

+1

私は非常によく知っている<<より大きな優先順位&が、なぜそれが<<は_insertion_演算子であり、4番目のケースでは左シフトではないことが明らかですか? @George – Akash

答えて

4

<<のチェーンの評価は、左から右に向かっています。 cout << a式はcoutを返すのでしたがって、

cout << a << b; 

(cout << a) << b; 

と同じである、あなたは、出力ストリームの両方のabで終わります。

括弧で順序を変更すると、<<の意味が左シフトに変更されます。

<<&に置き換えると、今すぐprecedenceが問題になりますので、状況が変わります。 &<<より低い優先順位を有する

(cout << a) & b; 

として解釈されるので、

cout << a & b; 

この式は、左右の整数の入力ストリームをとるオペレータ&を必要とします。このような演算子は存在しないため、コンパイラはエラーを報告します。

括弧を使用して再度評価の順序を強制すると、出力ストリームと整数に<<を適用すると見なされるため、(a&b)と計算され、出力ストリームに書き出されます。

+0

ありがとうございました。実際には、表示されたケースでは、最初にcoutがバインドされ(左シフトと同じです)、その動作ははっきりしませんでした。 Idkなぜ人々はオペレータの優先順位を考えて質問をdownvoted – Akash

関連する問題