我遇到了以下问题:
#include<iostream>
using namespace std;
int main ()
{
int cin;
cin >> cin;
cout << "cin" << cin;
return 0;
}
这个问题要求我找到程序的输出,给出的选项是:
(A) error in using cin keyword
(B) cin+junk value
(C) cin+input
(D) Runtime error
答案是(B(cin+垃圾值,但没有给出解释。有人能解释一下这个节目中发生了什么吗?
你遇到的问题绝对是邪恶的,作者忘记了包含正确答案。
局部cin
变量(由于using namespace std;
,阴影std::cin
(未初始化,而cin >> cin
是未初始化的cin
变量上的二进制位右移运算符。
C++标准没有定义这种行为。这意味着整个程序的行为是未定义的。
所以,这只不过是一个技巧问题——这些怪癖可能会出现,使用调试器可以快速识别它们。学会编码,不要学而不是如何编码。非常消极。
这里发生了什么?
#include<iostream> // ok: declares std::cin
using namespace std; // imports cin in main namespce
int main ()
{
int cin; // HIDES std::cin behind a local integer variable
// this is the integer shift operator,ON AN UNITIALIZED VARIABLE : UB
cin >> cin;
cout << "cin" << cin; // (could) dump junk because cin has never be initialized
return 0;
}
在大多数系统上,它会转储垃圾,因为它使用了一个统一的变量。但未定义的行为意味着根据标准,任何事情都可能发生。。。
答案是(B(cin+垃圾值,但没有给出解释。
答案是错误的:读取未初始化的变量是未定义的行为。
虽然你很可能会得到";cin"+垃圾值,这可能会持续到您更改编译器、升级编译器、更改编译优化设置、在其他特定应用程序运行时运行应用程序,或者(我想(直到行星排列发生变化:-\
正确的答案是";(可能(以上";或";取决于编译器实现";或";不可能正确地预测";。
唯一不可能的答案是
(A) error in using cin keyword
他们可能正在寻找(B)
,因为int
cin
尚未初始化,但读取它会使程序具有未定义的行为,因此(B)
无法得到保证。
int cin; // uninitialized
// UB: shifting a uninitialized variable by an uninitialized variable:
cin >> cin;
// UB: reading an uninitialized variable:
cout << "cin" << cin;
由于程序有UB,它甚至可能不会打印cin
。事实上,你可能会得到一些完全出乎意料的东西,比如
(C) cin+input // yes, even that - it'd be strange, but UB is UB
(D) Runtime error // and this
是的良好实践
尊重命名规则;使用命名空间std";
所以只做这个
std::cin >> cin;
将工作