私はこの質問に遭遇し、なぜ入力を求めていないのかを知ることができませんでした。 コードの出力はcin0です。 理由を説明してください。私のcppプログラムは入力を求めていません。
#include<iostream>
using namespace std;
int main()
{
int cin;
cin >> cin;
cout << "cin" << cin;
return 0;
}
私はこの質問に遭遇し、なぜ入力を求めていないのかを知ることができませんでした。 コードの出力はcin0です。 理由を説明してください。私のcppプログラムは入力を求めていません。
#include<iostream>
using namespace std;
int main()
{
int cin;
cin >> cin;
cout << "cin" << cin;
return 0;
}
行ごとに見てみましょう。
int cin;
この行は、cin
という名前のローカル変数を宣言しています。これ以降、cin
と書くときは、というコンパイラは常に、入力ストリームオブジェクトstd::cin
ではなく、このローカル変数を意味すると考えています。
cin >> cin;
この行はローカル変数を読み取り、ビットシフトを実行します。 >>
演算子の両辺が整数の場合、入力を意味しなくなります。今はビットシフトを意味します。
しかし、それは重要ではありません。
ポイントは、ローカル変数cin
は初期化されていません。この動作は未定義です。プログラム内で未定義の動作が1つあると、プログラム全体の動作が未定義になる可能性があります。
未定義の動作の問題を無視すると、ビットシフトの結果は何にも割り当てられず、したがって失われます。
cout << "cin" << cin;
ローカル変数cin
は、初期化せずにもう一度読み込まれます。これは未定義の行です。
動作が定義されていないため、はなぜ出力されたのかを意味しなくなりました。cin0
しかし、ローカル変数cin
のメモリにはゼロが含まれていると考えられます。
シャドウイング。
int cin;
cin >> cin;
2行目の両方のcinは、あなたが慣れていたクラスではなく、intを参照しています。あなたは計算a>>a
(すなわち、a/2^a
とおおよそ等価)です。ちょうどcinという変数があります。
別の変数名を選択してください。
'int cin;'?冗談ですか? –