gpt4 book ai didi

c - 变量的多个实例(静态、非静态)

转载 作者:太空宇宙 更新时间:2023-11-04 00:50:20 24 4
gpt4 key购买 nike

我遇到了这段 C 代码:

main(){
static int i=0;
i++;

if(i<=5){
int i = 3;
printf(" %d",i);
main();
}
}

1. 首先,我预计这段代码会产生编译错误,因为变量 i 有多个定义。但是,它编译并运行成功并给出了这个输出。

 3 3 3 3 3

2. 观察输出,3 正好打印了 5 次,这意味着循环是从 0 到 5 计算的,这意味着对于 if 条件 ,使用了 i 的第一个定义(静态)。

3 但是,打印的值是 3,这是 i 的第二个定义。

因此变量标签i 指的是内存中的两个不同实例。一个用作循环计数,进行递增,另一个用作打印的值。

我能以某种方式解释这一点的唯一方法是:

  1. int i = 3(第二个定义)在每次递归调用中重复。 i 的那个实例在函数被调用时创建,并在下一次递归调用时被杀死。 (因为静态作用域)。 printf 使用 this 实例,因为它是最新的定义(?)

  2. 当进入新的递归层次时,i++ 正在做。由于没有其他方法来解析此 i,它使用 i 的静态“实例”,它在代码中仍然“有效”,因为它被定义为静态.

但是,我无法确切地说明它是如何工作的。谁能解释一下代码和内存中发生了什么?

这里的编译器是如何绑定(bind)变量的?

最佳答案

内部作用域胜出。

例子:

int i = 1;
void foo() {
int i = 2; // hides the global i

{
int i = 3; // hides local i
}
}

此行为是设计使然。您可以做的是对变量范围使用不同的命名约定:

  • 全局/静态
  • 函数参数
  • 本地人
  • 类/结构成员

如果您在同一个函数中隐藏变量(例如函数参数和常规局部变量),一些编译器会发出警告。所以你的编译器的最大警告级别。

关于c - 变量的多个实例(静态、非静态),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21137603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com