2016-11-07 10 views
-6

私はこの質問に遭遇し、なぜ入力を求めていないのかを知ることができませんでした。 コードの出力はcin0です。 理由を説明してください。私のcppプログラムは入力を求めていません。

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

'int cin;'?冗談ですか? –

答えて

2

行ごとに見てみましょう。

int cin; 

この行は、cinという名前のローカル変数を宣言しています。これ以降、cinと書くときは、というコンパイラは常に、入力ストリームオブジェクトstd::cinではなく、このローカル変数を意味すると考えています。

cin >> cin; 

この行はローカル変数を読み取り、ビットシフトを実行します。 >>演算子の両辺が整数の場合、入力を意味しなくなります。今はビットシフトを意味します。

しかし、それは重要ではありません。

ポイントは、ローカル変数cinは初期化されていません。この動作は未定義です。プログラム内で未定義の動作が1つあると、プログラム全体の動作が未定義になる可能性があります。

未定義の動作の問題を無視すると、ビットシフトの結果は何にも割り当てられず、したがって失われます。

cout << "cin" << cin; 

ローカル変数cinは、初期化せずにもう一度読み込まれます。これは未定義の行です。

動作が定義されていないため、はなぜ出力されたのかを意味しなくなりました。cin0しかし、ローカル変数cinのメモリにはゼロが含まれていると考えられます。

2

シャドウイング。

int cin;
cin >> cin;

2行目の両方のcinは、あなたが慣れていたクラスではなく、intを参照しています。あなたは計算a>>a(すなわち、a/2^aとおおよそ等価)です。ちょうどcinという変数があります。

別の変数名を選択してください。

関連する問題