2017-01-10 13 views
-2
#include<iostream> 
using namespace std; 
int main() 
{ 
    int cin; 
    cin >> cin; 
    cout << "cin" << cin; 
    return 0; 
} 

私はここにこの質問を見た:http://quiz.geeksforgeeks.org/c-misc-c-question-8/ をそれらによって与えられた出力は次のようになります。CIN +ジャンクこのC++プログラムの出力はどのようになりますか?

しかし、私はそれがどうなるのか理解できません。 説明してください。

+3

初期化されていない変数を読み取ると、未定義の動作が発生します。 –

+0

プログラム自体に未定義の動作があります。基本的には、あなたのPCを仮想的に再フォーマットできるコードを意味します。 – WhiZTiM

+0

CINが変数名のためにそれを使用することはできませんので、それはあなたにエラーが表示されます、C++の予約語で、出力はあなたがこの場合のstd :: cinを>> CINに書く必要がありますので誤差 –

答えて

3

出力はcin + junkです。

これが可能ですが、正しい答えは「動作が未定義であるためわかりません」です。

のはラインでプログラム行の上に行こう:

int cin; 

変数はデフォルトで初期化されます。この場合、デフォルトの初期化は値が不確定であることを意味します。

cin >> cin; 

可変cinのビットがcin場所を右にシフトされます。ただし、不確定値を使用すると、未定義の動作が発生します。

動作が未定義であるため、プログラムの残りの部分は問題ありません。

あなたは不思議に思った場合には

、それが原因using namespace stdにグローバル名前空間に注入されていてものでstd::cinは関与しない、ローカル変数int cin影も。

4

この質問では、「トリックは」私たちはそうint cin;が存在している場合でも、あなたのようにcin >> cinを認識しません可能性があるコンソールからxを読むためにcin >> xを見ることに慣れている

cin >> cin; 

ですビットシフト動作。

これはUBです。つまり、実際にはには、とは何もありません。

  1. アプリはレジスタを選択し、「CIN」と呼んでいます。しかし、鼻悪魔が存在しない場合に、ここにあなたがのソートは、現代のコンパイラから期待できるものです。
  2. レジスタが最後に使用していた値を上書きしません。または、デバッグビルドでは、コンパイラ作成者が選択したマジックナンバーをそのレジスタに格納します。
  3. 次に、cinの値をcinビットだけシフトして返します(この操作ではcinは変更されません)。) - またはコンパイラが
  4. )コードのその行の後に何も微妙な副作用に依存しないので、それは(例えば、プロセッサのゼロフラグをセットとして有していてもよい完全cin >> cinを排除アプリ、文字列「CIN」は、続いて書き込みます値をコンソールに登録します。
  5. アプリケーションはきれいに終了し、呼び出し元(おそらくOS)に値0を返します。

tl; dr;cin >> cinは副作用のないビットシフト操作であり、コンソールからの入力を読み取る命令ではないため、乱数を出力します。

+0

ちなみに - 。?Visual Studioの2012年からのデバッグビルドを使用して、具体的には、ランタイムチェック失敗#3 - 変数 'c​​in'が初期化されずに使用されています。 –

0

CINを整数として宣言されると、それはもはや操作で読み取るために使用することができません。

再びそれはCIN変数のスコープに依存します。スコープが再び終了すると、通常のopsでのcinの機能が正常に機能します。

もcoutのためであっても同じ。

関連する問題