1
int TwoThrows();


int main(){

        int Throws, Throw, Frequency[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
        randomize();


        cout << "\nThis program simulates throws of two dice.";
        cout << "\n\nHow many throws : ";
        cin >> Throws;



        // Calls TwoThrows and saves in Frequency by value
        for(int I=0; I<Throws; I++){
                Throw=TwoThrows();   //2-12
                Frequency[Throw]++;   //2-12

        }

         // Prints array:
        for(int I=0; I<11; I++){
                cout << I+2 << ":\t" << Frequency[I+2] << "\n";

        }

        return 0;
}

int TwoThrows(){
        unsigned int I=(random(6)+1)+(random(6)+1);

        return I;

}

这打印:

2:1317 3:2724 4:4145 5:5513 6:7056 7:8343 8:6982 9:5580 10:4176 11:2776 12:1388

这是伟大的。

但是,我想知道的是,为什么我必须将数组设置为 {0,0,0,0,0,0,0,0,0,0,0,0,0}?

如果我不这样做;我得到:

2:30626868 3:1638233 4:844545295 5:1 6:9 7:4202510 8:4199197 9:844555757 10:3 11:4202574 12:2130567168

4

4 回答 4

4

如果您不初始化数组,然后继续增加其元素,从技术上讲,这是未定义的行为

在实践中发生的情况是,数组的元素在main()开始时会获取堆栈中发生的任何值。

于 2013-03-16T14:26:03.400 回答
2

局部变量放在函数的堆栈上。该区域未由编译器或操作系统初始化。这意味着局部变量的值正是调用函数时内存中的值,这不太可能是您想要的。

于 2013-03-16T14:27:33.653 回答
1

当您分配一个数组时,您在内存中获得了位置,因此该位置可以由另一个应用程序之前使用,因此如果不初始化该位置,它将根据哪个应用程序正在使用该位置为您提供意想不到的值。

于 2013-03-16T14:30:24.013 回答
1

尝试以这种方式理解它。所有内存位置都被收费,当我们将特定的内存位置分配给变量时,它将转换该位置所持有的原始值,也称为垃圾值,因此我们得到了意想不到的值。

但是当你初始化一个变量或数组时,默认的垃圾值被指定的值替换,我们得到了想要的输出。

希望这可以帮助。

于 2013-03-16T14:32:53.163 回答