这个问题中的“技巧”是
cin >> cin;
我们习惯于从控制台cin >> x
读取内容x
,即使int cin;
存在,也有可能您不会将其识别cin >> cin
为移位操作。
如前所述,这是UB,这意味着您真的不能期待任何事情。但在没有鼻恶魔,这里是你能有什么样的期望从一个现代化的编译器:
该应用程序选择一个寄存器,并将其称为“ cin”。
它要么不覆盖寄存器最后一次使用后仍然具有的值,要么-对于调试版本-将一些幻数(由编译器作者选择)存储到该寄存器中。
然后,它要么将值cin
逐cin
位右移并丢弃答案(即cin
未通过此操作修改。),否则编译器将cin >> cin
完全消除,因为该行代码之后没有任何内容取决于它可能具有的细微副作用(例如设置处理器的零标志)
然后,应用程序将字符串“ cin”和寄存器中的值写入控制台。
该应用程序干净地结束,将值0返回给其调用方(可能是OS)。
tl; dr; 它输出一个随机数,因为它cin >> cin
是无副作用的位移操作,而不是从控制台读取输入的指令。
这个问题中的“技巧”是
cin >> cin;
我们习惯于从控制台cin >> x
读取内容x
,即使int cin;
存在,也有可能您不会将其识别cin >> cin
为移位操作。
如前所述,这是UB,这意味着您真的不能期待任何事情。但在没有鼻恶魔,这里是你能有什么样的期望从一个现代化的编译器:
该应用程序选择一个寄存器,并将其称为“ cin”。
它要么不覆盖寄存器最后一次使用后仍然具有的值,要么-对于调试版本-将一些幻数(由编译器作者选择)存储到该寄存器中。
然后,它要么将值cin
逐cin
位右移并丢弃答案(即cin
未通过此操作修改。),否则编译器将cin >> cin
完全消除,因为该行代码之后没有任何内容取决于它可能具有的细微副作用(例如设置处理器的零标志)
然后,应用程序将字符串“ cin”和寄存器中的值写入控制台。
该应用程序干净地结束,将值0返回给其调用方(可能是OS)。
tl; dr; 它输出一个随机数,因为它cin >> cin
是无副作用的位移操作,而不是从控制台读取输入的指令。