2017-02-05 17 views
1

私は次のコードがなぜコンパイルされるのか理解しようとしていますか?C++なぜこのコードはコンパイルされますか?

#include<iostream> 
using namespace std; 
int main() 
{ 
    int cin; 
    cin >> cin; 
    cout << "cin" << cin; 
    return 0; 
} 

「cin >> cin」という文でコンパイラはどのように区別できますか?

+1

[警告付きでコンパイル](http://melpon.org/wandbox/permlink/tgFspjAMCsbzNGCY)[何が起こっているのかを知るのに役立ちます(https://msdn.microsoft.com/en-us/library/) 336xbhcz.aspx)。 – chris

+1

ローカル変数 'cin'はグローバル変数' cin'より「優先」です。 –

答えて

4

プログラムを実行すると、入力を待たないことに気づくでしょう。

何も区別しません。intを右シフトしています。

コンパイラの警告レベルを上げると、「警告:ステートメントは効果がありません」と表示されるはずです。

+0

私は、コンパイラが変数 'int cin'と変数 'istream cin'をどのように区別しているのかを知りたいと思っています(つまり、コンパイラが 'cin >> cin ')。 –

+0

ありがとう、今私は理解する。 –

0

molbdniloの答えへ追加するには:あなたが見上げる、あなたは現在のスコープ内のすべての変数のためのコンパイラを言っている、現在のスコープ内の識別子までループを声明using namespace std;を使用して、もしされていない場合は

ルックアップがグローバルスコープに達し、依然として識別子を見つけることができなくなるまで、親スコープのにある場合、を使用しているの名前空間で検索しようとします。

あなたはint cin宣言した後、メイン機能でcinと呼ばれ、すべてがちょうどcinをシフトし、ビットのcin量によって"cin"を左シフトしているあなたのコードのようにすべての、のstd :: cinをcinローカルint型ではないだろう。

関連する問題