这个C ++程序的输出是什么?

时间:2017-01-10 11:21:53

标签: c++ c++11 output c++14

#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 + junk

但我无法理解它是怎么来的? 请解释一下。

3 个答案:

答案 0 :(得分:5)

&#34;技巧&#34;在这个问题是

cin >> cin;

我们过去常常看到cin >> x从控制台阅读x,即使存在int cin;,您也有可能无法识别{{} 1}}作为位移操作。

正如已经提到的,这是UB,这意味着你无法真正期待任何东西。但是在没有鼻子恶魔的情况下,你可以从现代编译器那里得到那种所期望的东西:

  1. 该应用程序选择一个注册表并调用它&#34; cin&#34;。
  2. 它不会覆盖寄存器在上次使用时仍具有的任何值,或者 - 对于调试版本 - 将一些幻数(由编译器作者选择)存储到该寄存器中。
  3. 然后将cin >> cin中的值右移cin位并抛出答案(即cin未被此操作修改。) - 或编译器消除{{ 1}}完全是因为在该行代码之后没有任何内容依赖于它可能具有的微妙副作用(例如设置处理器的零标志)
  4. 该应用程序然后写入字符串&#34; cin&#34;然后是寄存器中控制台的值。
  5. 应用程序干净利落,将值0返回给调用者(可能是操作系统)。
  6. tl; dr; 它打印一个随机数,因为cin是一个没有副作用的位移操作,而不是从控制台读取输入的指令。

答案 1 :(得分:4)

  

他们给出的输出是:cin + junk。

虽然这是可能的,但正确答案是:&#34;我不知道,因为行为未定义。&#34;

让我们逐行浏览程序:

int cin;

默认初始化变量。在这种情况下,默认初始化意味着该值是不确定的。

cin >> cin;

变量cin的位向右移动cin个位置。但是,使用不确定值具有未定义的行为。

程序的其余部分并不重要,因为行为未定义。

如果你想知道,std::cin没有参与,因为即使它由using namespace std注入全局命名空间,局部变量int cin也会影响它。

答案 2 :(得分:0)

一旦cin被声明为整数,它就不能再用于操作中读取。

同样取决于cin变量的范围。一旦范围重新结束,cin就像在操作中阅读一样正常。

对于cout来说也是如此。