在不同函数中可以使用相同名字的变量吗

可以使用。C语言在函数中说明的变量为局部变量,只在函数内起作用,不会影响到其他函数。在不同函数中使用相同的变量名不代表是同一变量。

本教程操作环境:windows7系统、c99版本、Dell G3电脑。

在不同函数中可以使用相同名字的变量。

教程推荐:《c语言教程视频

在函数内部定义的变量(局部变量)

在函数内部定义的变量,它的作用域也仅限于函数内部,出了函数就不能使用了,我们将这样的变量称为局部变量(Local Variable)。函数的形参也是局部变量,也只能在函数内部使用。

int f1(int a){
    int b,c;  //a,b,c仅在函数f1()内有效
    return a+b+c;
}
int main(){
    int m,n;  //m,n仅在函数main()内有效
    return 0;
}

几点说明:

1) 在 main 函数中定义的变量也是局部变量,只能在 main 函数中使用;同时,main 函数中也不能使用其它函数中定义的变量。main 函数也是一个函数,与其它函数地位平等。

2) 形参变量、在函数体内定义的变量都是局部变量。实参给形参传值的过程也就是给局部变量赋值的过程。

3) 可以在不同的函数中使用相同的变量名,它们表示不同的数据,分配不同的内存,互不干扰,也不会发生混淆。

4) 在语句块中也可定义变量,它的作用域只限于当前语句块。

关于变量的命名

每一段可运行的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。

更多编程相关知识,请访问:编程教学!!

相关文章

1 在Visual Studio 中创建一个Asp.NET WebApi 项目,项目名:...
using ImpromptuInterface; using System; using System.Dyn...
https://blog.csdn.net/michaelgong/article/details/431485...
C#11添加了文件作用域类型功能:一个新的file修饰符,可以应...
在.NET中Newtonsoft.Json(Json.NET)是我们常用来进行Json序列...
设置允许跨域访问的网址--&gt; 设置预检有效时间--&...