使用函数返回多个值

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;
    ...

【讨论】:

以上是关于使用函数返回多个值的主要内容,如果未能解决你的问题,请参考以下文章

在函数中,如何在不使用 ref 游标的情况下返回多个值?

从 PL/SQL 函数返回多个值

快速从函数中返回多个值

使用 PyQt5“更新”从具有多个参数的函数中销毁返回值 [关闭]

Kotlin 协程Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )

Kotlin 协程Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )