1

我有两个函数,我将随机数添加到总值中。

问题是每次我调用该函数并打印总数时,它都不会添加。如果它生成 2,它将说总数为 2。之后,如果我再次调用它并生成 5,它说总数为 5,并且不添加(如果发生这种情况,它应该是 7。)

这里一切看起来都很好......

int human(int humanscore)
{
    int diceRoll= rand() % 7;
    cout << "player rolled: ";
    humanscore+= diceRoll;
    cout << diceRoll;
    cout << "human score is: " << humanscore;
}

int computer(int compscore)
{
    int diceRoll= rand() % 7;
    cout << "computer rolled: ";
    compscore+= diceRoll;
    cout << diceRoll;
    cout << "computer score is: " << compscore;
}
4

3 回答 3

9

您正在修改传递给函数的参数的内部副本的值。如果您希望对外部变量进行更改,请更改您的函数定义以获取引用:int& score.

另请注意,这rand() % 7将为您提供 [0, 6] 范围内的值。骰子的值在 [1, 6] 范围内,您应该使用它1 + rand() % 6

* 更新: *

这可以通过 C++ 引用来完成:

int computer(int& compscore)
{
    ...
    compscore += diceRoll;
    ...
}

int var = 0;
computer( var );

对于此声明,函数将实际变量var作为参数,并且compscore对函数内所做的更改反映在变量varcompscorevar因为特定调用只是同一变量的别名。

在 C 中,使用指针可以实现相同的效果:

int computer(int* compscore)
{
    ...
    *compscore += diceRoll;
    ...
}

int var = 0;
computer( &var );

这个函数的调用给它应该改变的变量的地址。对于一般用途,您可以假设使用引用的第一个实现将由编译器自动生成类似于最后一个片段的解决方案。

于 2011-10-11T23:11:50.100 回答
1

你在cout这里diceRoll,所以它只会打印当前卷而不是总数。

假设您正确打印掷骰子,您还需要在这些函数的末尾编写return humanscore;return compscore;传递回新结果。

于 2011-10-11T23:12:38.640 回答
1

您正在按值传递参数。这意味着当函数完成时,对它们的任何更改都会被丢弃。如果你想让你的分数保持不变,你有几个选择。您可以通过引用传递参数,这在 C++ 中可以通过传递指向分数的指针来完成。你可以让你的函数返回新的分数,然后在下次调用它时将返回的值传递给函数。您还将获得使用全局变量的不太理想的解决方案。

于 2011-10-11T23:16:18.783 回答