在C++中使用Cin关键字作为变量名



我遇到了以下问题:

#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),因为intcin尚未初始化,但读取它会使程序具有未定义的行为,因此(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;

将工作

最新更新