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

时间:2013-02-22 18:00:00

标签: 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;
}

6 个答案:

答案 0 :(得分:9)

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

  

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

第8.5 / 6段解释了 default-initialized 对不同变量类型的含义:

  

默认初始化 T类型的对象意味着:

     

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

     

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

     

- 否则,不执行初始化

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

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

  

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

答案 1 :(得分:4)

在为其分配任何值之前,您尚未初始化某些变量。它们以未指定的值开头,看起来是随机的。你可以像这样修复它

int guess = 0;
int guesses = 0;

答案 2 :(得分:3)

代码未初始化guessguesses,因此其初始值无法预测。

答案 3 :(得分:2)

你没有将猜测初始化为0.因此它将包含从它开始的内存地址中的任何内容

答案 4 :(得分:2)

您没有初始化猜测,因此您不知道该值是什么。 C / C ++没有保证他对未初始化变量的价值是什么。

最好始终初始化所有值

int guesses = 0;

答案 5 :(得分:1)

您没有将guesses变量初始化为零。

如果使用g ++编译代码,例如,使用以下标志,问题就变得很明显了:

$ g++ -O2 -Wall foo.cpp 
foo.cpp: In function ‘int main()’:
foo.cpp:25:38: warning: ‘guesses’ may be used uninitialized in this function [-Wmaybe-uninitialized]

请注意,除了警告标志之外,还需要优化标志来触发警告,至少使用g ++ 4.7.2。

故事的道德:启用编译器警告。