c語言中,變數的按作用域角度分類的幾種情況

聲明不同的數據類型,你對編譯說明了這個數據的大小和運算方式,這樣編譯程序就可以內分配內存的容大小和位置。比如你聲明一個 int 類型的變數,編譯程序就知道分配兩個位元組,這個空間可以被用來做加、減等數學運算。 存儲類型是對編譯器說明分配空間的位置。比如一個 int 數據,被聲明為auto時,在數據區分配內存,被聲明為static時,在程序區分配內存,被聲明為寄存器時,在寄存器分配內存(但要不是操系統,不要用這個類型),外部類型是你用其它文件的外部聲明是要用。 作用域從編程的角度來講的,並不像上兩個從編譯器的角度講。也就是一個變數可以被不同的作用域使用,或說是否透明。其實外部類型也可以這么理解,但是由於外部類型的聲明用到extern關鍵字,所以常在學習過程中與自動類,寄存器類,外部類和靜態類一起學。作用域在C中是由位置決定的,在C++中類的封裝中是由public,protect,private關鍵字決定,在類內也是由位置決定的。

② c語言中變數的作用域主要取決於變數的什麼

他定義的位置,在函數中定義的范圍只能是在函數內,全局的話都可用,類中的,類的成員可用
應該是說:
C語言中一個變數的作用域的開始位置只取決於它在函數的定義位置。
提前是可以改變。

③ 關於C語言中定義的變數的有效范圍的問題。

C 語言, 用大括弧括起的范圍叫「域」,每個域都是變數在前,之後才是語句。變數的有效范圍只能在域之內,也叫作用域。
外層域定義的變數在內層也是有效的。

④ C語言中變數作用域和區別是什麼

總的分為局部變數和全局變數:局部變數又可分為動態局部變數(沒特殊聲明的變數一般都為動態局部變數)和靜態局部變數(用static關鍵字聲明的變數如:static int a;);兩者的區別在於:靜態的局部變數生存期比動態的局部變數來的長,動態的局部變數的生存期為所定義的范圍內,如在函數內定義的,函數結束,變數也跟著結束,變數的值不會保存下來。而靜態變數的生存期為整個源程序(也可說是一個文件,不同環境不同稱呼)。而兩者的作用域是一樣。只能在定義他的函數內起作用,離開了這個函數就不起作用了。
全局變數:在函數之外定義的變數稱為全局變數。全局變數可以為本文件中其他函所共用(作用域),它的有效范圍(生存期)從定義變數開始到文件結束。
如果在同一個源文件中,外部變數與局部變數同名,則在局部變數的作用范圍內,外部變數被「屏蔽」,即全局變數不起作用。
下面來看一個例子:
#include"stdio.h"
int d=1; //聲明一個全局變數
int fun(int p)
{
static int d=5; //定義一個靜態局部變數 d初值為5 //第二次調用時沒有執行此行
d=d+p; //此時局部變數d的值為9,(第一次調用) //第二次調用是局部變數d 的值為13,因為上一次執行完後d的值為9,
printf("%d",d); //第一次輸出為9,//第二次輸出13
}
void main()
{
int a=3;
d=d+a; //此時d的值為4;a變數的值為3,全局變數d的值為1。
for(i=0;i<2;i++)
fun(d); //此處的d值為4,傳送給形參p,再一次調用時還是將4傳給開參p
printf("d=%d",d); //輸出d的值為4.此處的d為全局變數。
}

看以上內容時,你先把程序看一篇,然後把會值代進去遠算,每一次看注釋時在同一行中只要看到第二個」//「時結束.第2個「//」為第二次調用時看的。
以上內容有一點亂,但是希望可以幫助到你...88有什麼不明白可以再問!

⑤ c語言的執行順序問題(變數的作用域)

作用域的定義是這樣的:如果一個變數在某個文件或函數范圍內是有效的,則稱該專文件或函數為該變數的作屬用域,在此作用域內可以引用該變數,所以又稱變數在此作用域內「可見」,這種性質又稱為變數的可見性。例如
文件file.c
int
a;
main函數
{…
f2();

f1();
}
f1函數
{auto
int
b;

f2()

}
f2函數
{static
int
c;

}
這里a的作用域就是整個文件,b的作用域是f1函數,c的作用域是f2函數!其實作用域就是作用范圍沒什麼很復雜的概念!

⑥ 在c語言中什麼是變數的作用域

作用域的定義是這樣的:如果一個變數在某個文件或函數范圍內是有效的,則稱該文件或函數為該變數的作用域,在此作用域內可以引用該變數,所以又稱變數在此作用域內「可見」,這種性質又稱為變數的可見性。例如
文件file.c
int a;
main函數
{…
f2();

f1();
}
f1函數
{auto int b;

f2()

}
f2函數
{static int c;

}
這里a的作用域就是整個文件,b的作用域是f1函數,c的作用域是f2函數!其實作用域就是作用范圍沒什麼很復雜的概念!

⑦ C語言變數的作用域

准確而又通俗點來講,按變數是在函數體之內之外定義分兩大種。
1、局部變數:在函數內定義的,屬於所在的函數自己所有,與其他函數無關。局部變數隨所在函數被調用而產生,隨函數返回而消滅。
2、外部變數:也稱全局變數。在函數外定義,也就是定義不落在任何函數體內的,本質上屬於所有函數共用,從程序一開始運行就存在直到程序結束。
細一點分的話,局部變數還可以分出一種局部靜態變數。
3、局部靜態變數:定義時在類型名前加static關鍵字,特點是可以在函數下次被調用時恢復到上一次函數返回前的狀態。實質上是它從未消滅,只是因為它只歸函數自己使用,函數返回了便沒有其他函數能看到它,相當於暫時隱藏消失了而已。不是靜態的局部變數稱為自動變數,因為自動產生自動消滅。
外部變數也有在定義時類型名前加static關鍵字的一種分類,可稱為外部靜態變數。
4、外部局部變數:但不同於局部靜態變數是局部變數的恆久版,因為外部變數號稱全局,其本身就已經是恆久存在的。外部靜態變數實際上反倒變成了外部變數的限製版,僅限同一個文件內的函數使用,因此它更多被稱為本地變數,與全局變數相對。
這里看出static關鍵字的使用前後含義不一,確實有些別扭。與本地變數相類比,函數也有本地版的函數,僅限於被同一個文件內的函數調用,定義時也是在類型名前加static關鍵字。

這里不得不提到 聲明和定義的區別,非常重要。C語言要求所有的名字在使用前都至少要有聲明,以知道名字的類型等信息,所有在聲明或定義之前就使用的變數默認為其類型是int型,函數則其返回值為int型。任何名稱的定義只能有一處,聲明則不限,但聲明不得與定義相抵觸。
通常在多文件的項目中,多將全局變數和外部函數的聲明收集在一個頭文件中,因為這些名字都是共用的。
因此,C語言的要求是先聲明後使用,通過包含頭文件、在代碼前頭位置聲明或者在其他函數體內聲明,可以延伸作用域。

聲明的語法形式與定義很相似,有一些很零散的規則可以區分聲明和定義,外部變數的聲明和定義可以在類型名前顯式加extern關鍵字。但只有在定義時才可以用「=」後跟值或者表達式的形式予以初始化。
定義時如果不初始化,除將被自動變數外,其他變數默認初始化為全0或者NULL。
自動變數沒有默認初始化,因此如果自動變數定義時不初始化,起始值就是不確定的。

⑧ C語言中全局變數的作用域一定比局部變數的作用域大 對不

錯 如果同一個源文件中,只有一個主函數,外部變數與局部變數同名,則在局部變數的作用范圍內,外部變數被「屏蔽」,即它不起作用。所以是錯的

8.1.1 局部變數
局部變數也稱為內部變數。局部變數是在函數內作定義說明的。其作用域僅限於函數內, 離開該函數後再使用這種變數是非法的。
例如:
int f1(int a) /*函數f1*/
{
int b,c;
……
}
a,b,c有效
int f2(int x) /*函數f2*/
{
int y,z;
……
}
x,y,z有效
main()
{
int m,n;
……
}
m,n有效
在函數f1內定義了三個變數,a為形參,b,c為一般變數。在 f1的范圍內a,b,c有效,或者說a,b,c變數的作用域限於f1內。同理,x,y,z的作用域限於f2內。m,n的作用域限於main函數內。關於局部變數的作用域還要說明以下幾點:
1) 主函數中定義的變數也只能在主函數中使用,不能在其它函數中使用。同時,主函數中也不能使用其它函數中定義的變數。因為主函數也是一個函數,它與其它函數是平行關系。這一點是與其它語言不同的,應予以注意。
2) 形參變數是屬於被調函數的局部變數,實參變數是屬於主調函數的局部變數。
3) 允許在不同的函數中使用相同的變數名,它們代表不同的對象,分配不同的單元,互不幹擾,也不會發生混淆。如在前例中,形參和實參的變數名都為n,是完全允許的。
4) 在復合語句中也可定義變數,其作用域只在復合語句范圍內。
例如:
main()
{
int s,a;
……
{
int b;
s=a+b;
…… /*b作用域*/
}
…… /*s,a作用域*/
}
【例8.12】
main()
{
int i=2,j=3,k;
k=i+j;
{
int k=8;
printf("%d\n",k);
}
printf("%d\n",k);
}
本程序在main中定義了i,j,k三個變數,其中k未賦初值。而在復合語句內又定義了一個變數k,並賦初值為8。應該注意這兩個k不是同一個變數。在復合語句外由main定義的k起作用,而在復合語句內則由在復合語句內定義的k起作用。因此程序第4行的k為main所定義,其值應為5。第7行輸出k值,該行在復合語句內,由復合語句內定義的k起作用,其初值為8,故輸出值為8,第9行輸出i,k值。i是在整個程序中有效的,第7行對i賦值為3,故以輸出也為3。而第9行已在復合語句之外,輸出的k應為main所定義的k,此k值由第4 行已獲得為5,故輸出也為5。
8.1.2 全局變數
全局變數也稱為外部變數,它是在函數外部定義的變數。它不屬於哪一個函數,它屬於一個源程序文件。其作用域是整個源程序。在函數中使用全局變數,一般應作全局變數說明。 只有在函數內經過說明的全局變數才能使用。全局變數的說明符為extern。但在一個函數之前定義的全局變數,在該函數內使用可不再加以說明。
例如:
int a,b; /*外部變數*/
void f1() /*函數f1*/
{
……
}
float x,y; /*外部變數*/
int fz() /*函數fz*/
{
……
}
main() /*主函數*/
{
……
}
從上例可以看出a、b、x、y 都是在函數外部定義的外部變數,都是全局變數。但x,y 定義在函數f1之後,而在f1內又無對x,y的說明,所以它們在f1內無效。a,b定義在源程序最前面,因此在f1,f2及main內不加說明也可使用。
【例8.13】輸入正方體的長寬高l,w,h。求體積及三個面x*y,x*z,y*z的面積。
int s1,s2,s3;
int vs( int a,int b,int c)
{
int v;
v=a*b*c;
s1=a*b;
s2=b*c;
s3=a*c;
return v;
}
main()
{
int v,l,w,h;
printf("\ninput length,width and height\n");
scanf("%d%d%d",&l,&w,&h);
v=vs(l,w,h);
printf("\nv=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3);
}
【例8.14】外部變數與局部變數同名。
int a=3,b=5; /*a,b為外部變數*/
max(int a,int b) /*a,b為外部變數*/
{int c;
c=a>b?a:b;
return(c);
}
main()
{int a=8;
printf("%d\n",max(a,b));
}
如果同一個源文件中,外部變數與局部變數同名,則在局部變數的作用范圍內,外部變數被「屏蔽」,即它不起作用。

⑨ C語言「局部變數作用域」的問題

沒有什麼不對啊。完全正常的。

因為從main()調用add( )函數時的實參num=3在完成了傳遞值以後版,main( )與add( )函數的變數之間就相互沒有了權關系。add( )函數中num++並輸出4以後,對main( )函數中的變數沒有絲毫的關系,所以返回後,輸出main( )中的num的值仍是3。