本文目錄一覽:
關於c語言auto變數和static變數區別
auto是自動變數,在C語言中編譯器已給不加關鍵字的定義默認為自動變最,即auto,因此在實際中沒必要加。static是靜態變數,即該變數不會改變,任何賦值都無效,有點類似預處理。
C語言中的自動變數和寄存器變數是什莫?
C語言學習之變數存儲
C語言中對變數的說明包括兩方面的內容:變數類型以及變數的存儲類型。變數類型如:int(整形),char(字元型)是用來說明變數所佔用的內存空間的大小。變數存儲類型用來說明變數的作用範圍。
C語言的變數存儲類有:自動類、寄存器類、靜態類和外部類。
關鍵字auto加在變數名及其類型前,用來說明它是自動變數。局部變數是指在函數內部說明的變數(有時也稱為自動變數)。用關鍵字auto進 行說明, 當auto省略時, 所有的非全程變數都被認為是局部變數, 所以auto實際上 從來不用。 局部變數在函數調用時自動產生, 但不會自動初始化, 隨函數調用的結束, 這個變數也就自動消失了, 下次調用此函數時再自動產生, 還要再賦值, 退出時又自動消失。
static稱為靜態變數。根據變數的類型可以分為靜態局部變數和靜態全程變數。
1. 靜態局部變數
它與局部變數的區別在於: 在函數退出時, 這個變數始終存在, 但不能被其它
函數使用, 當再次進入該函數時, 將保存上次的結果。其它與局部變數一樣。
2. 靜態全程變數
靜態 全程變數就是指只在定義它的源文件中可見而在其它源文件中不可見的變數。它與
全程變數的區別是: 全程變數可以再說明為外部變數(extern), 被其它源文件使用,而靜態全程變數卻不能再被說明為外部的, 即只能被所在的源文件使用。
extern稱為外部變數。為了使變數除了在定義它的源文件中可以使用外, 還要 被其它文件使用。因此, 必須將全程變數通知每一個程序模塊文件, 此時可用 extern來說明。
寄存器變數to能夠長在執行速度很重要的情況下使用。其思想是告訴編譯程序把該變數放在一個CPU寄存器中。因為數據在寄存器中操作比在內存中快,這樣就提高了程序代碼的執行速度。寄存器變數的說明是在變數名及類型之前加上關鍵字register。值得注意的是取地址運算符不能作用於寄存器變數。
file1.c
#include stdlib.h
#include stdio.h
int reset();
int next();
int last();
int sum(int );
int i=1;
void main()
{
auto int i,j;
i=reset();
for(j=1;j=3;j++)
{
printf(“i=%d\tj=%d\n”,i,j);
printf(“next(i)=%d\n”,next());
printf(“last(i)=%d\n”,last());
printf(“sum(i+j)=%d\n”,sum(i+j));
}
}
file2.c文件
static int i=10;
int next()
{
return(i+=1);
}
int last()
{
return(i-=1);
}
int sum(int i)
{
static int j=5;
return(i=j+=i);
}
file3.c文件
extern int i;
reset()
{
return(i);
}
運行結果:
i=1 j=1
next(i)=11
last(i)=10
sum(i+j)=7
i=1 j=2
next(i)=11
last(i)=10
sum(i+j)=10
i=1 j=3
next(i)=11
last(i)=10
sum(i+j)=14
具體分析一下三個文件中的變數的種類。
在file1.c的開頭聲明i是外部變數,並出示化為1。而在main函數內部,說明了兩個自動變數i和j,這樣在main內部出現的i就是自動量。在file3.c的開頭說明i是外部的,表明它與file1.c定義的i是同一個變數,所以reset的值返回的就是這個i的當前值1。file2.c文件已開始就定義了變數i,並聲明為靜態變數,因此它的使用範圍只在當前文件中使用。然而從函數sum中定義來看,其內部用到的i是形式參數,j是內部靜態變數,它們與以前的i,j都不同。
具體執行過程分析如下:
首先程序經過編譯後聲稱可執行文件,運行可執行文件後,函數從Main函數體進入,在初始化的過程中得到i為全局變數,初值為1。進入main函數後首先調用函數reset(),進入文件file3.c,文件file3.c聲明i為外部變數,所以此時i的值為1,則返回的值為1。函數reset()執行完後返回主函數,繼續執行循環體中的程序。循環體首先調用函數next(),程序進入file2.c文件,判斷i為靜態變數,所以此時i的值為10,執行next()之後i的值為11,返回值為11,並將11作為i的值。當調用last()函數時,判斷i的值為11,執行函數後,i的值變為10,並將10作為i的值。最後執行函數sum(i),此時值的注意的是執行程序時傳遞的是形參,即第一次調用時實際計算的值為sum(i+j=2),這樣調用函數sum(i)後執行的結果為i=5+2=7,即為執行的結果。依次類推,分別為7,10,14。
通過以上的程序可以理解不同的存儲類型的作用範圍不同,在程序設計中如何靈活的使用各種不同的存儲類型是能夠使程序更靈活。
C語言的定義變數問題?
auto
(1)auto關鍵字在C語言中只有一個作用,那就是修飾局部變數。
(2)auto修飾局部變數,表示這個局部變數是自動局部變數,自動局部變數分配在棧上。(既然在棧上,說明它如果不初始化那麼值就是隨機的······)
(3)平時定義局部變數時就是定義的auto的,只是省略了auto關鍵字而已。可見,auto的局部變數其實就是默認定義的普通的局部變數。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/182352.html