首頁  >  文章  >  後端開發  >  在不同函數中可以使用相同名字的變數嗎

在不同函數中可以使用相同名字的變數嗎

青灯夜游
青灯夜游原創
2021-01-28 16:11:2424046瀏覽

可以使用。 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。

更多程式相關知識,請造訪:程式設計教學! !

以上是在不同函數中可以使用相同名字的變數嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn