C++为什么这个变量返回一个随机值?

Ada*_*zak 3 c++ random int

我在c ++中做了一个基本的"猜我的数字游戏",并且我添加了一个变量,用于猜测这个数字需要多少猜测.然而,当游戏结束时,显示猜测的随机值.像1980046322这样的东西.考虑到我没有在我的代码中添加任何特别的内容,我无法弄清楚为什么会这样做.

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
int randomNumber;
int guess;
int guesses;

srand((unsigned)time(0));
randomNumber = (rand()%10)+1;

cout << "I am thinking of a number between 1 to 10. Can you guess it?" << endl;

while(guess != randomNumber){
    cout << "That is not correct, try again.";
    guesses++;
    cin >> guess;
}

if(guess == randomNumber){
    cout << "Good Job. Guesses: " << guesses << endl;
    guesses++;
}

return 0;
}
Run Code Online (Sandbox Code Playgroud)

And*_*owl 9

根据C++ 11标准的第8.5/11段:

如果没有为对象指定初始化程序,则默认初始化该对象; 如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值.[注意:具有静态或线程存储持续时间的对象是零初始化的,请参见3.6.2. - 尾注]

第8.5/6段解释了不同变量类型的默认初始化方法:

缺省初始化类型的对象T表示:

- 如果T是一个(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);

- 如果T是数组类型,则每个元素都是默认初始化的;

- 否则,不执行初始化.

由于T在您的情况下既不是类类型也不是数组类型(所有默认初始化变量都具有类型int),因此不执行初始化并且初始值是不确定的.

此外,您的程序具有未定义的行为,因为它尝试读取未初始化的变量的值.这样做需要进行左值到右值的转换(尽管标准没有明确指定,可能需要这样做,参见SO上的问答),以及C++ 11标准的第4/1段要求:

可以将非函数非数组类型T的glvalue(3.10)转换为prvalue.53如果T是不完整类型,则需要进行此转换的程序是错误的.如果glvalue引用的对象不是类型T的对象,并且不是从T派生的类型的对象,或者如果对象未初始化,则需要此转换的程序具有未定义的行为.如果T是非类类型,则prvalue的类型是T的非限定版本.否则,prvalue的类型是T.54