使用函数返回多个值
Posted
技术标签:
【中文标题】使用函数返回多个值【英文标题】:Returning multiple values using functions 【发布时间】:2019-06-09 03:09:06 【问题描述】:我只是在尝试使用类/函数编写石头、纸、剪刀游戏的一些不同的东西。除了显示用户获胜次数、计算机获胜次数和平局数的结果之外,一切都运行良好。
我正在用 vs-code 编写代码。我查找了一些关于如何返回多个值的示例,发现这很有帮助。我目前正在使用指针来执行此方法,但是我不确定它是否根据代码的结果受到限制。
void winner(int* U, int* C, int* T)
*U = userWin
*C = compWins;
*T = numTies;
if(compChoice == userChoice)
std::cout << "It's a tie!\n";
numTies++;
else if(userChoice == 'P' && compChoice == 'R')
std::cout << "You win! Paper covers rock.\n";
userWins++;
else if(userChoice == 'S' && compChoice == 'R')
std::cout << "Computer wins! Rock beats scissors.\n";
compWins++;
else if(userChoice == 'S' && compChoice == 'P')
std::cout << "You win! Scissors beats paper.\n";
userWins++;
else if(userChoice == 'R' && compChoice == 'P')
std::cout << "Computer wins! Paper covers rock.\n";
compWins++;
else if(userChoice == 'R' && compChoice == 'S')
std::cout << "You win! Rock beats scissors.\n";
userWins++;
else if(userChoice == 'P' && compChoice == 'S')
std::cout << "Computer wins! Scissors beats paper.\n";
compWins++;
else std::cout << "Invalid input.\n";
std::cout << "\n";
int main()
rps obj;
char char1('y');
int userWins;
int compWins;
int numTies;
std::cout << "THIS IS A GAME OF ROCK, PAPER, SCISSORS!\n";
do
obj.player();
obj.computer();
obj.winner(&userWins, &compWins, &numTies);
std::cout << "Enter y to play again or anything else to win: ";
std::cin >> char1;
std::cout << "\n";
while(char1 == 'y' || char1 == 'Y' );
obj.results();
...
Please enter Rock, Paper, or Scissors - 'R' for Rock, 'P' for Paper, 'S' for Scissors: R
The computer chose scissors.
You win! Rock beats scissors.
Enter y to play again or anything else to win: n
Here are the results...
YOU: 1 COMPUTER: -416437631 TIES: 32769
代码的结果会打印出用户获胜次数的预期值。但是,它似乎正在打印计算机获胜次数和平局数的内存位置。
【问题讨论】:
【参考方案1】:您忘记初始化变量。在main
中,将声明更改为:
int userWins = 0;
int compWins = 0;
int numTies = 0;
然后,在winner
,去掉:
*U = userWin
*C = compWins;
*T = numTies;
并改变:
userWins++;
到:
(*U)++;
对于其他计数器也是如此。
【讨论】:
这似乎不起作用。结果相同,“(*userWins)++”导致间接错误。这很奇怪,因为winner() 计算用户获胜次数,并在代码结束后显示用户获胜次数的值。我希望计算机获胜和平局数量也会发生同样的情况,因为暗示了相同的方法。但它会打印内存位置:/ 对不起,我看的不够仔细。我更新了答案。摆脱winner
顶部的指针分配,并通过指针进行分配(我使用了错误的名称 - 请参阅更新的答案)。
没关系,所以我在一个类中将 userWINs、compWins 和 numTies 声明为 int 类型并将它们公开。但是,我没有将它们设置为零,因为我收到了警告。是在被认为是坏代码的类中初始化它们,或者是。那只是编译器的事情。 ps:当我在类中将它们初始化为等于0时它起作用了。
你肯定需要初始化它们以避免捡起任何垃圾。如果它们是类成员,则在构造函数中初始化它们。
非常感谢!我做到了,它运行顺利。【参考方案2】:
在主函数中,您需要使用初始值“0”来初始化 int 变量。 这将阻止编译器给出那些变量,你在那里看到的垃圾值。
int main()
rps obj;
char char1('y');
int userWins=0;
int compWins=0;
int numTies=0;
...
【讨论】:
以上是关于使用函数返回多个值的主要内容,如果未能解决你的问题,请参考以下文章
使用 PyQt5“更新”从具有多个参数的函数中销毁返回值 [关闭]
Kotlin 协程Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )
Kotlin 协程Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )