更改变量的值后,如何防止它在 C 循环中(函数内部)重复时变回

After changing the value of a variable, how to keep it from changing back when repeated in a loop (inside a function) in C

提问人:Aviosche 提问时间:6/4/2023 最后编辑:Jonathan LefflerAviosche 更新时间:6/5/2023 访问量:71

问:

我是一名学生,正如你所看到的,我目前正在学习 C。我编写了一个代码,用于打印一个可由 a 和 d 控制的滑块,b 是我用来移动滑块的变量。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int b = 2;
void slider();

int main() {
    //int Ar[5] = {};


    while (true) {
        
        slider();

    }

}


void slider() { 
    int Ar[5] = {};
    
    switch (_getch()) {
    case'a':
        Ar[b] = 0;
        b--;
        if (b <= 0)
            b = 0;
        Ar[b] = 1;
        break;
    case'd':
        Ar[b] = 0;
        b++;
        if (b >= 4)
            b = 4;
        Ar[b] = 1;
        break;
    }
    for (int i = 0; i < 5; i++) {
        if (Ar[i] == 1)
            printf("|");
        else
            printf("-");
    }
    printf("\n");
    
}

问题是,当我在没有全局变量的情况下或在函数内部使用此代码并在 while 循环中使用该代码时,我无法让它工作,因为 b 将在每次重复后返回值 2。

我真正需要的是让它像在当前代码形式中一样工作,但不使用全局变量并将代码保留在单独的函数中。全局变量在这个项目中是被禁止的(所以请告诉我该代码中除了 int b=2 之外是否有其他内容;算作全局变量),并且滑块是更大项目的一部分,因此它将在函数中调用。

c 变量 while-loop

评论

3赞 Yksisarvinen 6/4/2023
没有一种语言叫做“C/C++”。有C和C++,两者之间非常不同。
0赞 Steve Summit 6/4/2023
在回答您的特定问题时,如果您在函数内部声明,并且将其声明为 ,它将在调用中保留其值。(不过,可能有更好的方法可以实现您想要做的事情。bsliderstatic int b;
2赞 Aviosche 6/4/2023
@Yksisarvinen我知道没有一种语言叫做 C/C++。我的第一年,我们一起学习 C 和 C++,因为它们在基本水平上非常相似。明年我们将更加关注 C++,这就是为什么我写了两者的名字,以防万一 C++ 中有一个方法在 C 中不起作用,我仍然想学习它。
1赞 Jonathan Leffler 6/4/2023
我不相信这是一个合理的教学策略。如果他们先教 C,然后教 C++,反之亦然会更好。但不要在 SO 上称它为 C/C++。你会招来诽谤和反对票。你的代码是纯 C;用 C 标记它。如果它使用任何 C++ 功能(也不是 C 语言),请使用 C++ 标记它。不要用两种语言来标记它,除非你希望了解这两种语言之间的特定区别。
0赞 Aviosche 6/5/2023
@JonathanLeffler 谢谢你让我知道这件事。我理解你的意思,在我以后的帖子中会更加小心。对于教学策略部分,确切地说,他们教我们 C,但由于我们明年将看到 C++,他们向我们展示了 C++ 可以做一些不同的部分,作为一些先验知识和比较。

答:

0赞 huskyherders 6/5/2023 #1

问题在于变量的范围。每次调用函数时,在函数中声明和初始化的变量都将使用相同的值重新初始化。函数返回后,变量将不再有效,并且不会在函数调用之间跟踪任何内容。

根据允许您使用的内容,有几个选项:

  1. 使用静态函数变量。在函数中,将 b 声明为静态,这将使变量值在函数调用的作用域内。从技术上讲,这不是一个全局变量,因此根据您声明的标准,它可能会被允许。静态变量不会像其他函数变量那样位于堆栈上,而是与实际应用程序中创建的其他全局变量位于相同的内存位置,但只有声明它的函数才能访问它。
  2. 不确定您是否已经完成了指针,但另一种选择是跟踪 main 中的值并将该值作为指向修改它的函数的指针传递。这将允许从函数调用外部跟踪该值,并在函数中进行修改。如果这样做,则必须在检查或修改 b 的值时修改滑块函数以使用(即 、 等)像这样:*b(*b)++*b<=0
int main() {
    int b = 2;
    while (true) {
        slider(&b);
    }
}


void slider(int *b) {
// Modify references to b to become *b
} 
  1. 另一个不使用 static 或指针的选项是让 main 声明和跟踪 b,但不是传入指针,而是返回 b 的新值,以便 main 可以更新它。像这样:
int main() {
    int b = 2;
    while (true) {
        b = slider(b);
    }
}


int slider(int b) {
// Function unchanged
...
    return b; //return at end of last line so that main can track current value
}