C语言代码关于变量的命名
发布时间:2023-05-16 13:45:57 所属栏目:语言 来源:
导读:每一段可运行的C语言代码都包含了多个作用域,即使最简单的C语言代码也是如此。
int main(){
return 0;
}
这就是最简单的、可运行的C语言代码,它包含了两个作用域,一个是 main() 函数内部的局部作用域,一
int main(){
return 0;
}
这就是最简单的、可运行的C语言代码,它包含了两个作用域,一个是 main() 函数内部的局部作用域,一
每一段可运行的C语言代码都包含了多个作用域,即使最简单的C语言代码也是如此。 int main(){ return 0; } 这就是最简单的、可运行的C语言代码,它包含了两个作用域,一个是 main() 函数内部的局部作用域,一个是 main() 函数外部的全局作用域。 C语言规定,在同一个作用域中不能出现两个名字相同的变量,否则会产生命名冲突;但是在不同的作用域中,允许出现名字相同的变量,它们的作用范围不同,彼此之间不会产生冲突。这句话有两层含义: 不同函数内部可以出现同名的变量,不同函数是不同的局部作用域; 函数内部和外部可以出现同名的变量,函数内部是局部作用域,函数外部是全局作用域。 1) 不同函数内部的同名变量是两个完全独立的变量,它们之间没有任何关联,也不会相互影响。请看下面的代码: #include <stdio.h> void func_a(){ int n = 100; printf("func_a: n = %d\n", n); n = 86; printf("func_a: n = %d\n", n); } void func_b(){ int n = 29; printf("func_b: n = %d\n", n); func_a(); //调用func_a() printf("func_b: n = %d\n", n); } int main(){ func_b(); return 0; } 运行结果: func_b: n = 29 func_a: n = 100 func_a: n = 86 func_b: n = 29 func_a() 和 func_b() 内部都定义了一个变量 n,在 func_b() 中,n 的初始值是 29,调用 func_a() 后,n 值还是 29,这说明 func_b() 内部的 n 并没有影响 func_a() 内部的 n。这两个 n 是完全不同的变量,彼此之间根本“不认识”,只是起了个相同的名字而已,这就好像明星撞衫,北京和云南都有叫李红的,赶巧了而已。 2) 函数内部的局部变量和函数外部的全局变量同名时,在当前函数这个局部作用域中,全局变量会被“屏蔽”,不再起作用。也就是说,在函数内部使用的是局部变量,而不是全局变量。 变量的使用遵循就近原则,如果在当前的局部作用域中找到了同名变量,就不会再去更大的全局作用域中查找。另外,只能从小的作用域向大的作用域中去寻找变量,而不能反过来,使用更小的作用域中的变量。 下面我们通过一个具体的例子来说明: #include <stdio.h> int n = 10; //全局变量 void func1(){ int n = 20; //局部变量 printf("func1 n: %d\n", n); } void func2(int n){ printf("func2 n: %d\n", n); } void func3(){ printf("func3 n: %d\n", n); } int main(){ int n = 30; //局部变量 func1(); func2(n); func3(); printf("main n: %d\n", n); return 0; } 运行结果: func1 n: 20 func2 n: 30 func3 n: 10 main n: 30 代码中虽然定义了多个同名变量 n,但它们的作用域不同,所有不会产生命名冲突。 下面是对输出结果的分析: 对于 func1(),输出结果为 20,显然使用的是 func1() 内部的 n,而不是外部的 n。 调用 func2() 时,会把 main() 中的实参 n 传递给 func2() 中的形参 n,此时形参 n 的值变为 30。形参 n 也是局部变量,所以就使用它了。 func3() 输出 10,使用的是全局变量,因为在 func3() 中不存在局部变量 n,所以编译器只能到函数外部,也就是全局作用域中去寻找变量 n。 main() 中 printf() 语句输出 30,说明使用的是 main() 中的 n,而不是外部的 n。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |