在c中,是否有一个合适的方法来解释这个(post中的例子)循环动作顺序,它是否也会影响不同的动作?

yyyllmsg  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(78)

我是一个机械工程专业的学生,正在学习C语言,所以我的问题不是关于如何帮助编码,而是关于如何理解程序中的动作逻辑(因为这是我将要进行的测试)。
这篇文章来自x1c 0d1x首先我假设循环将在退出括号之前检查“n>0”的条件,因此将检查内部的静态int。但是相反,它将首先退出}括号,然后进行检查,这意味着我超出了静态int范围,并且int将始终为3,因为递减将只影响静态int。
tl;dr-
我的问题是,我该如何解释这种行为?是否有一个适当的解释,为什么会发生这种顺序,以便我能够使用该逻辑来理解使用该逻辑的不同代码片段的行为?
提前致谢

z9zf31ra

z9zf31ra1#

foo中有两个名为n的不同变量。第一个是参数n,它是由调用方传入的。第二个是循环体内部的静态声明。
while测试中的n指的是参数。循环体中的静态n仅在循环体执行时才在作用域中,而在对循环测试求值时永远不在作用域中,因此循环永远不会退出。
如果在n小于或等于零的情况下调用foo,则循环将立即退出,函数将返回x。否则,如果n大于零,则进入无限循环。循环体内的静态n对循环测试没有影响。

cetgtptt

cetgtptt2#

我想你要说的是“变量阴影”
当程序中有多个同名变量时,就会发生变量隐藏。
示例如下:

#include <stdio.h>

int x = 42;  <--- variable with name x

void foo(void)
{
    printf("%d\n", x);  <-- which x variable is being printed here
}

void bar(int x)   <--- variable with name x
{
    printf("%d\n", x);  <-- which x variable is being printed here
}

int main(void)
{
    int x = 1;    <--- variable with name x
    printf("%d\n", x);  <-- which x variable is being printed here
    foo();
    bar(1234);
}

字符串
这里的输出将是:

1
42
1234


因为

  • main中的局部变量x隐藏了全局变量x
  • bar中的局部变量x隐藏了全局变量x

在给定的(块)作用域中,变量x的最后一个定义决定了使用哪个x变量。
在您的程序中,while主体中的int static n变量隐藏了fooint n变量(又名参数)。换句话说,在while体内部,n引用int static n变量,在while体外部,n引用int n变量/函数参数。
你可以在这里阅读更多:https://en.wikipedia.org/wiki/Variable_shadowing#:~:text= In%20computer%20programming%2C%20variable%20shadowing,is%20known%20as%20name%20masking.

相关问题