# include <stdio.h>
int main(void)
{
int a = 1;
int b = 2;
void f(void)
{
a = b;
b = a;
printf("a:%d, b:%d\n",a,b);
}
f();
return 0;
}
这里为什么报错????
# include <stdio.h>
int main(void)
{
int a = 1;
int b = 2;
void f(void)
{
a = b;
b = a;
printf("a:%d, b:%d\n",a,b);
}
f();
return 0;
}
这里为什么报错????
作用域是在编译的过程中就确定的,而不是运行的时候动态变换。
f这个函数它所在的父作用域就是全局环境,而不是main函数这个环境。
在main函数中只是调用了f这个函数,并不是定义,故f不可能访问到main中的所有变量。
你可以理解为f与main是两个有独立环境的函数,它们可以相互调用,但是不能直接访问对方的内部变量。
要想达到你所说的要求,方法可以是把main中的a与b提升为全局变量。
建议多看看基础的书.
# include <stdio.h>
int a = 0; // f 调用的是我
int b = 0; // f 调用的是我
void f(void)
{
// 此处使用的是全局变量
printf("a:%d, b:%d\n",a,b);
}
int main(void)
{
// 这里的 a & b 是局部变量 只对main 函数生效 外部是无法调用的
int a = 1;
int b = 2;
f();
return 0;
}
直接 在函数外部定义变量试试 .
这种嵌套函数,在不同上下文里调用你这个函数,修改的变量是不一样的,也就是函数实际行为是动态的,而C语言是编译型的语言,一个函数的机器码编译时就确定了,而且变量名在编译成机器语言就没有了,所以你这个要标准C不支持的。
不过在C++里,你这个嵌套函数,捕获外部变量的要求是可以用lambda表达式实现的
你这种写法是
nested function
,嵌套定义函数C99标准以及C++规范中均不支持
nested function
GNU C 扩展规范中支持
nested function
,实测使用gcc
编译也确实输出了a:2 b:2
的正确结果但其他的C编译器,以及所有的C++编译器(包括g++)均不支持,并且这种写法也是不被推荐的