为什么这个C++程序打印"2"?

PyR*_*oss 3 c++ cin

我是C++的新手,但这是我的代码:

#include <iostream>
using namespace std;

int main() {
    int x;
    cin >> x;
    cout << "x = " << x << endl;
    system("pause");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

每当我输入字母时,它总是打印出来x = 2.我知道我应该输入数字,但为什么"2"?

Jam*_*nze 12

因为你有未定义的行为.你应该从来没有检查,输入成功使用任何输入值.当输入失败时访问输入值(如果输入int的alpha,它将会保留)将使值保持其先前状态 - 如果您从未初始化它,否则未初始化(并且访问未初始化的值是未定义的行为).


Mat*_*son 5

因为x是不确定的 - 你没有给它一个值.将其更改为int x = 42;,它将为您提供确定的值.

如果operator >>(发生的事情cin >> x)不会改变输入x中找不到至少一个数字(在跳过任何空格之后)的值.

您可以(并且应该)检查cin是否成功if (cin >> x) ... safe to use x ...; else cout << errormessage;.

但我试图解释"它是怎么来的2",而不是"这里有关于阅读输入的章节和经文".

  • @Axel嗯,不,从未初始化的变量中读取它是UB. (2认同)
  • @Axel标准明确指出在这种情况下行为是未定义的,我可以很容易地想象它可能崩溃的实现.参见C++ 11中的§4.1/ 1:"[...]或者如果对象未初始化,则需要这个[左值到右值]转换的程序具有未定义的行为." 这适用于系统中的_every_类型(但在其他地方有`char`和`unsigned char`的明确例外). (2认同)