#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 。
但我无法理解它是怎么来的? 请解释一下。
答案 0 :(得分:5)
&#34;技巧&#34;在这个问题是
cin >> cin;
我们过去常常看到cin >> x
从控制台阅读x
,即使存在int cin;
,您也有可能无法识别{{} 1}}作为位移操作。
正如已经提到的,这是UB,这意味着你无法真正期待任何东西。但是在没有鼻子恶魔的情况下,你可以从现代编译器那里得到那种所期望的东西:
cin >> cin
中的值右移cin
位并抛出答案(即cin
未被此操作修改。) - 或编译器消除{{ 1}}完全是因为在该行代码之后没有任何内容依赖于它可能具有的微妙副作用(例如设置处理器的零标志) 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来说也是如此。