【问题标题】:How to get a value of the return only?如何仅获得回报的价值?
【发布时间】:2022-07-29 07:43:37
【问题描述】:

如何在不再次运行函数的情况下获取函数返回的值?

例如:

int difficulty() {
    char x;
    while (true) {
        if (kbhit()) {
            x = getch();
            if (x == '1' || x == '2' || x == '3') {
                return x;
                break;
            }
        }
    }
    cout << "done";
}

这个函数被调用:

void Move(){
    if (HeadY >= Height-1 || HeadY <= 0 || HeadX >= Widht-1 || HeadX <= 0)
        Lose = false;
    char level=diffculty(); //**********
    if(level=='2' || level=='3'){
        for(int i=0;i<Ta_N;i++)
            if(HeadX==Ta_X[i] && HeadY==Ta_Y[i])
                Lose = false;
    }
}

并在菜单函数中调用:

void menu(){
    if(kbhit()){
        x=getch();
        if(x=='s' || x=='S'){
            system("cls");
            table();
            while(Lose){
                Line();
                Input();
                Move(); //***********
                Sleep(50);
            }
            system("pause");
        }
    }

我只需要x 值来比较它,但它会再次运行代码??

【问题讨论】:

  • 将返回值保存在变量int xx = difficulty();中。然后每当您以后需要返回值时,只需使用变量xx
  • 也许您可以详细说明“再次运行代码”是什么意思?我不确定你的意思。在评估x 时,它肯定不会重新运行getch()
  • 请注意,除非您特别需要 getch(),否则请注意,包含 conio.h 会使您的代码 100% 无法移植到 Windows 以外的任何地方。
  • @kimo_liz 然后将其移出循环。如果您不希望某事多次发生,请不要将其置于循环中。没有更多的上下文,很难给出更具体的建议。
  • 我做了,但变量保存在 for 循环中然后请显示您有问题的代码。您展示了代码的工作部分,并没有展示您需要修复的代码。

标签: c++


【解决方案1】:

我假设您想在menu() 中创建x,然后将其存储为变量,以传递在menu() 中开始的函数调用链。

在这个假设下,你应该做的很简单。 menu() 变为:

void menu(){
    if(kbhit()){
        char x=getch();   // CHANGED
        if(x=='s' || x=='S'){
            system("cls");
            table();
            while(Lose){
                Line();
                Input();
                Move(x);   //CHANGED
                Sleep(50);
            }
            system("pause");            
       }
   }
}

那么Move()应该修改成Move(char x)

void Move(char x){   // CHANGED
    if (HeadY >= Height-1 || HeadY <= 0 || HeadX >= Widht-1 || HeadX <= 0)
        Lose = false;
    char level = difficulty(x);   // CHANGED
    if (level=='2' || level=='3'){
        for (int i=0;i<Ta_N;i++)
            if (HeadX==Ta_X[i] && HeadY==Ta_Y[i])
                Lose = false;
    }
}

difficulty() 变为 difficulty(char x)

char difficulty(char x) {   //CHANGED 
    // DELETED LINE char x;
    // REDUNDANT AS EXPLAINED IN COMMENT BELOW while (true) {
    // REDUNDANT    if (kbhit()) {
            // DELETED LINE x = getch();
    if (x == '1' || x == '2' || x == '3') {
        return x;
                // DELETE THIS break;
    } else
        throw("what happens when x != 1 or 2 or 3?");   //ADDED
    // REDUNDANT   } else
    // REDUNDANT        throw("what happens when kbhit() is false?");   
    // REDUNDANT }
    cout << "done";
}

【讨论】:

  • 你为什么要通过引用传递x?函数没有修改它,因此不需要传递引用。只需传递值即可。此外,由于您正在改变事物,whilekbhit() 将不再属于 difficulty(),因为它现在由 menu() 处理
  • @RemyLebeau 显然x 没有被修改,但谁知道kbhit() 有没有副作用?所以为了安全起见,我选择通过引用传递x
  • 您如何期望kbhit()x 产生副作用?它没有,也不能。所以不,在这个例子中根本不需要通过引用传递x
  • @RemyLebeau 我同意没有必要在difficulty() 中调用kbhit(),因为它已经用于控制menu() 中的流。我已经相应地更改了我的答案,但是您正忙于输入自己的消息并否决我的答案并且没有费心检查。
猜你喜欢
  • 2018-03-01
  • 2018-08-27
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
相关资源
最近更新 更多