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

Using Cin Keyword as Variable name in C++

我遇到了以下问题:

#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+junk值,但没有给出任何解释。有人可以解释一下这个程序中发生了什么吗?

是一个很好的实践:

尊重命名规则,不要“使用命名空间标准”

所以就这样做

std::cin >> cin;

会起作用

你遇到的问题太邪恶了,作者忘了附上正确答案。

局部cin变量(shadowsstd::cin由于using namespace std;)未初始化,cin >> cin是未初始化 cin 变量的二进制按位右移运算符。

此行为未由 C++ 标准定义。这意味着整个程序的行为是未定义

所以,这只不过是一个技巧性问题 - 这些怪癖可能会出现,使用调试器可以快速识别它们。学习编码,而不是学习如何编码。非常消极。

唯一不可能的答案是

(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

这里发生了什么?

#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;
}

在大多数系统上,它会转储垃圾,因为它使用了一个未初始化的变量。但是未定义的行为意味着按照标准绝对任何事情都可能发生...

The answer is given to be as (B) cin+junk value, but no explanation has been given.

答案是错误的:读取未初始化的变量是未定义的行为。

虽然您可能会得到“cin”+ 垃圾值,但这种情况可能会持续到您更改编译器、升级编译器、更改编译优化设置,您运行 你的应用程序,而其他一些特定的应用程序是 运行ning,或者(我猜)直到行星排列改变:-\

正确答案是“(可能)none 以上”或“取决于编译器实现”或“不可能正确预测”。