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基礎,如有不對的地方,歡迎一起讨論;