提问人:Aviosche 提问时间:6/4/2023 最后编辑:Jonathan LefflerAviosche 更新时间:6/5/2023 访问量:71
更改变量的值后,如何防止它在 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
问:
我是一名学生,正如你所看到的,我目前正在学习 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 之外是否有其他内容;算作全局变量),并且滑块是更大项目的一部分,因此它将在函数中调用。
答:
0赞
huskyherders
6/5/2023
#1
问题在于变量的范围。每次调用函数时,在函数中声明和初始化的变量都将使用相同的值重新初始化。函数返回后,变量将不再有效,并且不会在函数调用之间跟踪任何内容。
根据允许您使用的内容,有几个选项:
- 使用静态函数变量。在函数中,将 b 声明为静态,这将使变量值在函数调用的作用域内。从技术上讲,这不是一个全局变量,因此根据您声明的标准,它可能会被允许。静态变量不会像其他函数变量那样位于堆栈上,而是与实际应用程序中创建的其他全局变量位于相同的内存位置,但只有声明它的函数才能访问它。
- 不确定您是否已经完成了指针,但另一种选择是跟踪 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
}
- 另一个不使用 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
}
上一个:变量在 C 中自行更改其值
评论
b
slider
static int b;