C 中的外部(全局)变量
The external (global) variables in C
我正在阅读一本 C 编程书籍,The C Programming Language(K & R,第 2 版)。我在书上了解了外部变量的事实,但是当我自己实践这些原理时,我发现了一些不同的东西。书上说:
"... because external variables remain in existence permanently, rather than appearing and disappearing as functions are called and exited, they retain their values even after the functions that set them have returned."
然而,当我这样编码时:
#include <stdio.h>
int i = 0;
void foo();
main()
{
foo();
printf("%d", i);
return 0;
}
void foo()
{
i = 1;
}
程序打印 1 而不是 0,这是外部变量的原始值 i
。所以想知道我在思考原理和理解的时候哪里出错了
这句话与你的想法相反
...as functions are called and exited, they remain their values even
after the functions that set them have returned
表示在退出函数后,具有外部链接的变量在函数中保留分配给它的值。你的程序演示了这一点。
注意,现在根据 C 标准,不带参数的函数 main 应声明为
int main( void )
函数没有默认类型int
,但一些编译器保持向后兼容性。
...they retain their values even after the functions that set them have returned.
我猜这是你的解释问题。
鉴于变量是全局变量,每次您在任何函数中更改它时,它都会假定并保留该值,直到它被下一次修改。
取函数:
int i = 0;
void foo();
int main()
{
int x = 0;
foo(x);
printf("%d", i);
printf("%d", x);
return 0;
}
void foo(int x)
{
x = 1;
i = 1;
}
结果:x = 0
i = 1
x
是按值传递的,本质上是它的一个副本,所以一旦函数超出范围,即 returns,副本就会被丢弃。 i
是全局的,所以你甚至不需要传递它;每个函数都知道它的存在并会改变它的值。
我正在阅读一本 C 编程书籍,The C Programming Language(K & R,第 2 版)。我在书上了解了外部变量的事实,但是当我自己实践这些原理时,我发现了一些不同的东西。书上说:
"... because external variables remain in existence permanently, rather than appearing and disappearing as functions are called and exited, they retain their values even after the functions that set them have returned."
然而,当我这样编码时:
#include <stdio.h>
int i = 0;
void foo();
main()
{
foo();
printf("%d", i);
return 0;
}
void foo()
{
i = 1;
}
程序打印 1 而不是 0,这是外部变量的原始值 i
。所以想知道我在思考原理和理解的时候哪里出错了
这句话与你的想法相反
...as functions are called and exited, they remain their values even after the functions that set them have returned
表示在退出函数后,具有外部链接的变量在函数中保留分配给它的值。你的程序演示了这一点。
注意,现在根据 C 标准,不带参数的函数 main 应声明为
int main( void )
函数没有默认类型int
,但一些编译器保持向后兼容性。
...they retain their values even after the functions that set them have returned.
我猜这是你的解释问题。
鉴于变量是全局变量,每次您在任何函数中更改它时,它都会假定并保留该值,直到它被下一次修改。
取函数:
int i = 0;
void foo();
int main()
{
int x = 0;
foo(x);
printf("%d", i);
printf("%d", x);
return 0;
}
void foo(int x)
{
x = 1;
i = 1;
}
结果:x = 0
i = 1
x
是按值传递的,本质上是它的一个副本,所以一旦函数超出范围,即 returns,副本就会被丢弃。 i
是全局的,所以你甚至不需要传递它;每个函数都知道它的存在并会改变它的值。