天天看點

黑馬程式員-c語言變量作用域問題

c語言中的變量作用域總結

不管什麼語言,main好像總是程式的入口,大括号是它的内容;變量的作用域總是困擾着我們,接下來,我們循序漸進的搞明白c語言中的變量作用域,首先得知道c是弱類型的語言,弱類型表現在很多方面:

1:你可以直接在程式中寫一個常量,然後一個分号:1;

2:在定義函數時,void型的函數可以return;int型的可以不用寫傳回值。

………還有很多

下面我們一步一步開始:首先在main中定義的變量當然作用于整個main函數了

1:在main中定義變量

#include<stdio.h>

int main()

{

int a=0;

printf(“%d\n”,a);

return 0;

}

2:當在一個結構體中,即大括号中定義時(後邊的#include<stdio.h>都省略了):

//結構體中

//首先結構體中是可以通路外層的變量的,這裡可以直接通路a;

//printf(“%d\n”,a);

//其實上邊在通路a的時候,編譯器是會先在目前結構體中找a,如果沒有才找外層的a

int a = 1;//當然這裡這個a隻屬于目前結構體中,即在大括号結束時,a被銷毀,并不會影響外邊的a;

printf(“%d\n”,a);//輸出1

printf(“%d\n”,a);//輸出還是0

3:結構體可以多層嵌套的,多層嵌套時的情況:

int a = 0;

//第一層結構體

printf(“%d\n”,a);//輸出0

int a = 1,b=10;

//第二層嵌套

int a = 2;

printf(“%d\n”,a);//輸出2

//printf(“%d\n”,b);//這個是不能通路的,b在内層結構體中

總結:當有多層結構體嵌套時,最内層的可以通路外層的,但是外層的不可以通路内層的

4:通過3的例子總結,似乎可以解釋一切的變量作用域了,但是随着知識的不斷學習,又有了新的疑惑

//在for的循環體中定義變量,且循環體隻有一條語句,建議任何時候都寫大括号

for (int a=0; a<3; a++)

        int b

= 0;//報錯,不能定義變量,要定義隻能在大括号中

這個其實比較好了解,如果不加大括号,表面上看b屬于main的全局,因為隻有一對main函數的大括号,但是對于for循環來講,又希望這個

b在循環結束就釋放掉,這樣就沖突了,是以編譯器強制在for循環體中定義變量時定義在大括号中;類似的還有case語句中定義變量,所

以在使用for或者case時,即使語句隻有一條也加上大括号;

5:for循環中的其他情況,對比函數(方法)定義時的變量作用域

for(int a=0; a<3; a++,b++)//這裡的b當然是不能通路了,b是在下邊的一對大括号中定義的,也就是内層結構體中

printf(“%d\n”,a);//依次輸出0、1、2,前提上邊小括号中的b++删掉

int a = 10;//這個重名的a是可以的,在上邊定義過a後,循環體重可以繼續定義a,這個根據1、2中的結構體來了解

int b = 0;

printf(“%d\n”,a);//每次都輸出10

上邊的例子來看for循環中的局部變量a可以在循環體中定義重名變量,隻是每一次循環結束,循環體中的a會被釋放

但是在定義函數時,形參是不能在函數體中定義重名變量的

int test(int num1, int num2)

int num1 =

0;//這個是不允許的,按照上邊的for循環來講是可以的,但是函數的形參是等待接收實參的值的,并且這個值要在函數體//中參與運算的,是一個很有意義的變量,c不允許重新定義與形參同名的變量名以防止這個形參真的沒了意義,而for中的a隻是讓循

//環繼續的一個條件,即使在循環體中重新定義了,每次循環結束後,會被釋放,a又回到了原來的值,并不影響循環,是以可以;

以上都是個人的了解,自己也是正在學習c基礎,如有不對的地方,歡迎一起讨論;

繼續閱讀