我在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;
}
答案 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)
代码未初始化guess
或guesses
,因此其初始值无法预测。
答案 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。
故事的道德:启用编译器警告。