c語言寄存器變數
㈠ c語言自動變數,靜態變數,寄存器變數,這塊有點不明白求詳細解釋及其應用。
寄存器變數可以不理解、自動變數就是我們不加任何說明聲明的變數(一般我們所說的變數都是自動變數)、靜態變數是用static聲明的、它不可以再次賦值它的值是累加的、舉個例子你就明白了、int pri() /*局部的*/{int b=0;b++;return b;}int sta() /*靜態的*/{static int a=0;a++;return a;}main(){int i,k,p;for (i=1 ;i<6;i++)k=sta();p=pri();printf("%d",k);/*這時輸出的k值依次是1 2 3 4 5 */printf("%d",p);/*這時輸出的P值都是1 1 1 1 1 */}
㈡ C語言中可以定義寄存器變數到底可以定義多少空間的寄存器變數我該如何知道這個區域的大小
register是一個"建議"型關鍵字,意指程序建議該變數放在寄存器中,但最終該變數可能因為條件不滿足並未成為寄存器變數,而是被放在了存儲器中,所以可以不用糾結這個了。
如果你想了解有CPU多少寄存器,可參考下面資料:
新型 x86 處理器提供以下可以通過編譯器進行分配的寄存器:8 個 32 位的通用寄存器、8 個 80 位的浮點寄存器和 8 個 128 位的矢量寄存器。所有 x64 處理器提供 16 個 64 位的通用寄存器、8 個 80 位的浮點寄存器和至少 16 個矢量寄存器(每個矢量寄存器至少 128 位)。新型 32 位 ARM 處理器提供 15 個 32 位的通用寄存器和 32 個 64 位的浮點寄存器。所有 64 位的 ARM 處理器提供 31 個 64 位的通用寄存器、32 個 128 位的浮點寄存器和 16 個 128 位的矢量寄存器 (NEON)。
㈢ c語言的變數定義
C語言中變數遵循「先定義後使用」的原則:
1、定義變數的格式:數據類型 變數名;
首先要強調的一點是:變數的定義是一條語句,每條語句都是以分號結尾的。故定義完變數,後面不要漏掉「;」分號。
在變數定義中,「數據類型」表示想要存儲什麼類型的數據就定義什麼類型的變數。
如想要存儲整數就定義成 int 型;想要存儲小數就定義成 float 型或 double 型;想要存儲字元就定義成 char 型等等。
「變數名」就是你想給這個變數起個什麼名字,通常都是用字母、數字與下劃線組合而成。比如:
「int i;double price;double goods_price2」等等。
就表示定義了一個整型變數 i、小數型變數price、goods_price2;
2、變數定義完成後,接下來就是使用變數,為變數賦值。
將一個值放到一個變數中,這個動作叫「賦值」。通俗點講,「給變數賦值」意思就是將一個值傳給一個變數。
賦值的格式是:
變數名 = 要賦的值;
它的意思是將=右邊的數字賦給左邊的變數。比如:
i = 3;
這就表示將 3 賦給了變數 i,此時 i 就等於 3 了。
3、變數的定義和賦值,可以分成兩步寫,也可以將它們合成一步,而且事實上,在實際編程中用得最多的也是合二為一的寫法。
形式如下:
數據類型 變數名 = 要賦的值;
比如:int i = 3;
就表示定義了一個變數 i,並把 3 賦給這個變數。它與
int i;
i =3;
是等價的。
在定義變數時也可以一次性定義多個變數,比如:
int i, j;
這就表示定義了變數 i 和 j。這里需要強調的是,當同時定義多個變數時,變數之間是用逗號隔開的,千萬別寫成分號。這是很多新手最容易犯的錯誤,即將逗號和分號記混了。
同樣也可以在定義多個變數的同時給它們賦值:
int i = 3, j = 4;
中間還是用逗號隔開,最後別忘記輸入分號。
最後需要注意的是,在較老的 C89/C90 標准(也稱 ANSI C 標准)中,變數只能在程序的開頭定義,或者說變數定義的前面不能有其他非聲明或非定義的語句。
(3)c語言寄存器變數擴展閱讀:
在主回答中,提到了變數定義時,變數名通常都是用字母、數字與下劃線組合而成,但是實際上,變數名也不是隨便組合的,變數定義需要遵循一定的規范,否則容易產生歧義,影響整體程序代碼 的可讀性。
所以在定義變數的時候,要注意以下命名規范:
(1)、變數名的開頭必須是字母或下劃線,不能是數字。實際編程中最常用的是以字母開頭,而以下劃線開頭的變數名是系統專用的。命名應當直觀且可以拼讀,可望文知意,便於記憶和閱讀。
標識符最好採用英文單詞或其組合,不允許使用拼音。程序中的英文單詞一般不要太復雜,用詞應當准確。
(2)、變數名中的字母是區分大小寫的。比如 a 和 A 是不同的變數名,num 和 Num 也是不同的變數名。當標識符由多個片語成時,每個詞的第一個字母大寫,其餘全部小寫。
比如: int CurrentVal;
這樣的名字看起來比較清晰,遠比一長串字元好得多。
(3)、變數名絕對不可以是C語言關鍵字,不能有空格。
(4)、變數名的長度應當符合「min-length && max-information」原則。
C 是一種簡潔的語言, 命名也應該是簡潔的。例如變數名MaxVal 就比MaxValueUntilOverflow 好用。標識符的長度一般不要過長,較長的單詞可通過去掉「母音」形成縮寫。
另外,英文詞盡量不縮寫,特別是非常用專業名詞,如果有縮寫,在同一系統中對同一單詞必須使用相同的表示法,並且註明其意思。
㈣ C語言 register寄存器變數問題
因為register只是一個「建議性」的關鍵字,實際上編譯程序不一定會把指定的變數真的當寄存器處理:)
真正的寄存器是沒有地址的,但你下面做了取地址操作,所以這個「建議」就杯具了:)
㈤ 在C語言中register是什麼意思又起到了什麼作用
register是做聲明的,為了提高效率。
㈥ 編程里,自動變數和寄存器變數是怎麼回事
什麼是自動變數呢?自動變數就是指在函數內部定義使用的變數。他只是允許在定義他的函數內部使用它。在函數外的其他任何地方都不能使用的變數。自動變數是局部變數,即它的區域性是在定義他的函數內部有效。當然這說明自動變數也沒有鏈接性,因為它也不允許其他的文件訪問他。由於自動變數在定義他的函數的外面的任何地方都是不可見的,所以允許我們在這個函數外的其他地方或者是其他的函數內部定義同名的變數,他們之間不會發生沖突的。因為他們都有自己的區域性,而且它沒有鏈接性(即:不允許其他的文件訪問他的)。來看看自動量的持續性。計算機在執行這個函數的時候,創建並為它分配內存,當函數執行完畢返回後,自動變數就會被銷毀。這個過程是通過一個堆棧的機制來實現的。為自動變數分配內存就壓棧,而函數返回時就退棧。
/* auto */
#include <stdio.h>
int main()
{
int print();
int var,i;
for(i=0;i<=10;i++)
var=print();
printf("%d\n",var);
return 0;
}
int print()
{
auto int i=0; /* 自動變數 */
i+=1;
printf("%d\n",i);
return i;
}
/* end */
靜態變數:
靜態變數與自動變數的本質區別是,靜態變數並不像自動變數那樣使用堆棧機制來使用內存。而是為靜態變數分配固定的內存,在程序運行的整個過程中,它都會被保持,而不會不銷毀。這就是說靜態變數的持續性是程序運行的整個周期。這有利於我們共享一些數據。如果靜態變數在函數內部定義,則它的作用域就是在這個函數內部,僅在這個函數內部使用它才有效,但是它不同於自動變數的,自動變數離開函數後就會別銷毀,而靜態變數不會被銷毀。他在函數的整個運行周期內都會存在。在函數外面定義的變數為全局變數,工程內的所有文件都可以訪問他,但是它在整個工程內只能定義一次,不能有重復的定義,不然就會發生錯誤,而其他的文件要想使用這個變數,必須用extern來聲明這個變數,這個聲明叫做引用聲明。這一點很重要,如過你沒有用extern 來聲明在其他文件中已經定義的全局變數,就來使用它,就會發生錯誤如果你只是想在定義他的文件中使用它,而不允許在其他的文件中使用它,那麼就用關鍵字 static來在函數外面聲明變數。這樣這個變數在其他文件中將不可見,即它的連接性而內部鏈接。有一點是我們只得注意的像:如果你在函數外這樣聲明一個變數,const int a ; 變數a的連接性為內部鏈接,只能在定義他的文件內使用。還有如果你在定義靜態變數的時候並沒有給變數初始化,則靜態變數將被自s動初始化為0;
/* static */
#include <stdio.h>
int main()
{
int print();
int var,i;
for(i=0;i<=10;i++)
var=print();
printf("%d",var);
return 0;
}
int print()
{
static int i; /*靜態變數 */
i+=1;
printf("%d\n",i);
return i;
}
/* end */
寄存器變數:
在c語言當中可以使用寄存器變數來優化程序的性能,最常見的是在一個函數體當中,將一個常用的變數聲明為寄存器變數: register int ra; 如果可能的話,編譯器就會為它分配一個單獨的寄存器,在整個函數執行期間對這個變數的操作全都是對這個寄存器進行操作,這時候就不用頻繁地去訪存了,自然就提高了性能.但是寄存器變數不是強制性的,也就是,即使你使用register關鍵字去聲明一個變數為寄存器變數,編譯器還是有可能把它作為一個普通的變數而不是寄存器變數來使用的. 在我們寫程序的過程當中,有時候會經常用到一個全局變數,如果能夠把它作為寄存器變數來使用,顯然可以提高程序的性能,特別是對於那些對性能要求比較高的程序(比如模擬器,虛擬機等).拿X86平台來說,如果使用Gcc擴展,可以按照如下方式聲明一個全局寄存器變數,並指定它存入ebx寄存器:int ra asm("ebx");用作這種用途的還有「ebp, ebx, esi, edi".這時候需要在編譯程序的時候給出特別的選項,因為有些寄存器原本是另有用途的,比如ebp寄存器,原來是做frame-pointer用.
易失變數:
volatile:(嵌入式程序員必須掌握的)volatile最初的意思是表示汽油容易揮發,在c中的作用大概有兩點(1)表示變數是易失的,易變的. (2)強制訪存操作,防止編譯器去優化,告訴編譯器每次必須去內存中取值,而不是從寄存器或者緩存.
㈦ 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語言 靜態變數和寄存器變數可以定義外部變數嗎定義有什麼條件
static修飾函數:
在修飾非成員函數時表示該函數不是全局函數,而僅供本文件使用;
在修飾成員函數時,表示該函數只能調用類的靜態成員變數並且該方法可以不必經由實例化的類對象就能夠應用;
static修飾變數:
修飾全局變數時,該變數只能供本文件內部使用;
修飾成員變數時,該變數成為類變數,存儲在靜態存儲區中,不經過類實例就可以訪問該變數;
修飾局部變數時,該變數在函數第一次被調用時初始化,並將其存放到靜態存儲區,函數退出後變數值保持不變,下一次進入函數時將跳過對它的初始化,它的生命周期直到程序退出。
最後,要說明的是,static變數在全局中只有一份,不會有多份拷貝。
extern用於聲明變數時,如果不指出變數的類型,則默認為int,如果不是int的,必須顯示指出變數的類型,否則出錯。
extern實際上只對變數有用,對函數而言,只是個幌子(能夠更加清晰明了的讓我們知道也讓編譯器知道該函數可以用於「外交」),沒有實質性的作用,以後記住了,看到extern和函數扯上關系,你理都不用理,直接把它拿掉就OK了。但是它還是有那麼一點用的,既然「存在的就是合理的」,那麼它必然有點用啦,利用它可以在程序中取代include 「*.h」來聲明函數,在一些復雜的項目中,我比較習慣在所有的函數聲明前添加extern修飾。
本質上,我認為,函數可以將聲明和定義分開,而變數就不行了,因此只能藉助於extern來實現這一點,要是變數也能將聲明和定義分開,或許extern根本就不該活在這個世上。
extern可以被寫在變數/函數的聲明/定義處,但是標準的用法應該只是將其寫在聲明處,寫在定義處只不過為了再次強調或直觀明了而已。
㈨ C語言中 自動變數 靜態變數 寄存器變數 外部變數 有可比性嗎區別在哪簡單易懂點吧~
c語言中變數分為四類,分別是
1.auto 自動變數
2.static 靜態存貯分配變數(又分為內部靜態和外部靜態)
3.extern 外部變數/全程變數(用於外部變數說明)
4.register 寄存器變數(分配在硬體寄存器中)
四大類,所有變數必須先說明(定義),後使用。
下面分別介紹
1.自動變數(局部變數)
局部變數:在一個函數開頭或段開頭處說明的變數,
它有幾個特徵,,
a、作用域為定義它的函數
b、編譯器不會對自動變數給予隱含的初值,故其值不確定,因此每次使用前必須明確的置初值。
c、形參是自動變數,作用域僅限於相應函數內
d、自動變數隨函數的引用而存在和消失,由一次調用到下一次調用之間不保持值。
2.外部變數:在函數外部定義的變數即為外部變數,它的作用域是整個程序(全程變數)。
a. c程序可以分別放在幾個文件上,每個文件可以作為一個編譯單位分別進行編譯。外部變數只需在某個文件上定義一次,其它文件若要引用此變數時,應用extern加以說明(外部變數定義時不必加extern關鍵字)。
b. 在同一文件中,若前面的函數要引用後面定義的外部(在函數之外)變數時,在函數里加extern加以說明。
引進外部變數的原因:解決函數單獨編譯的協調;與變數初始化有關;外部變數的值是永久的;解決數據共享;
注意:函數本身也被認為是外部變數
3.靜態變數:分為內部靜態變數和外部靜態變數
內部靜態變數:a.在局部變數前加上static就為內部靜態變數
b.靜態局部變數仍是局部變數,其作用域仍在定義它的函數范圍內,但它採用靜態存貯分配(由編譯程序在編譯時分配,而一般的自動變數和函數形參均採用動態存貯分配,即在運行時分配空間),當函數執行完,返回調用點時,該變數並不撤銷,再次調用時,其值將繼續存在。
外部靜態變數:a.在函數外部定義的變數前加static即為外部靜態變數
b.作用域為定義它的文件,即成為該文件的私有變數,其他文件上的函數一律不得直接訪問,除非通過它所在文件上的函數進行操作,這可實現數據隱 藏。
4.寄存器變數:只有自動(局部)變數和函數參數才能進一步指定為寄存器存貯類
a.使用register變數可以提高存取速度,但寄存器變數的數目依賴於具體機器,聲明多了也只有前幾個有效。
b.只限於int,char,short ,unsigned和指針類型用寄存類。
c.不能對register變數取地址(即&操作)
㈩ c語言如何讀寄存器的值
1、首先,輸入寄存器變數關鍵字【register】。
注意事項:
C語言描述問題比匯編語言迅速、工作量小、可讀性好、易於調試、修改和移植,而代碼質量與匯編語言相當。C語言一般只比匯編語言代碼生成的目標程序效率低10%~20%。因此,C語言可以編寫系統軟體。