C語言關(guān)鍵字之a(chǎn)uto register詳解
一:auto
在學(xué)習關(guān)鍵字auto之前我們需要先了解兩個概念:作用域和生命周期。
作用域
作用域(scope)是程序設(shè)計概念,通常來說,一段程序代碼中所用到的名字并不總是有效/可用
的 而限定這個名字的可用性的代碼范圍就是這個名字的作用域。
局部變量的作用域:作用范圍包含在代碼塊中的變量。在哪兒內(nèi)定義,只在其范圍內(nèi)有效。
全局變量的作用域:在所有函數(shù)外定義的變量。整個項目中都有效。
我們用簡單代碼來理解一下:
int a = 20; int main() { if (1) { int b = 10; printf("%d", b); } return 0; }
這段代碼中我們可以看到我們創(chuàng)建了兩個變量,一個是全局變量 a ;一個是局部變量 b 。
根據(jù)作用域的定義我們可以知道:
全局變量a的作用域是整個工程:
局部變量b 的作用域只是包含在if括號內(nèi)部:
為了我們更好的理解這個代碼我們寫幾種代碼,加深理解:
int a = 20; int main() { if (1) { int b = 10; } printf("%d", a); printf("%d", b); return 0; }
這段代碼我們發(fā)現(xiàn)報錯
雖然我們b創(chuàng)建了,但是b是一個局部變量,作用域只在代碼塊內(nèi)部( if 括號內(nèi)部 ),不包括printf這一行,因此程序報錯,訪問不到b。
特殊的:
當局部變量和全局變量發(fā)生沖突時,局部變量優(yōu)先。
這句話的意思是:當定義的變量名相同時,局部變量優(yōu)先
int a = 20; int main() { a = 10; printf("%d", a); return 0; }
我們打印就可發(fā)現(xiàn):
當全局變量和局部變量發(fā)生沖突時,局部變量優(yōu)先。為了避免這種問題的出現(xiàn),盡量不要使用相同的變量名定義。
生命周期
變量的生命周期指的是變量的創(chuàng)建到變量的銷毀之間的一個時間段
局部變量的生命周期是:進入局部變量所在范圍開始 ----> 出了局部變量的范圍結(jié)束
全局變量的生命周期是:整個程序的生命周期。生命周期main函數(shù)進入--->結(jié)束 整個程序的生命周期
為了更方便的理解:我們可以通俗的理解為,一個變量的存活時間,就是這個變量的生命周期。
例:古代某一皇帝從出生-->駕崩。從出生到駕崩這一段時間就是這位皇帝的生命周期。
// ***************生命周期*********** //int g = 100;//全局變量的生命周期: // //生命周期main函數(shù)進入--->結(jié)束 整個程序的生命周期 //int main(){ // { // 局部變量生命周期: // //進入局部變量所在范圍開始 ----> 出了局部變量的范圍結(jié)束 // int a = 100; // printf("%d\n", a); // } // // // return 0; //}
auto
auto號稱是最寬宏大量的關(guān)鍵字
auto的使用:一般在代碼塊中定義的變量,局部變量,默認都是auto修飾的。只在本代碼塊中使用 auto可省略。
用代碼解釋就是:
auto int g_val = 100; int main() { for (auto int i = 0; i < 10; i++) { printf("i = %d\n", i); if (1) { auto int j = 1; printf("before: %d\n", j); j++; printf("after: %d\n", j); } } return 0; }
由于auto只可修飾局部變量
因此第一句auto int g_val = 100;是錯誤的
在之后的代碼內(nèi)部的全局變量中,auto所修飾的局部變量中的auto都是可以省略的,因此我們也說auto是最古老的關(guān)鍵字,我們在平時的編程中也可省略auto。
二:register
register -- 寄存器 ----最快的關(guān)鍵字
我們首先要了解存儲等級
離CPU越近的存儲單元,效率越高,成本單價越高。
離CPU越遠的存儲單元,效率越低,成本單價越低。
對于任意一種硬件而言,上游硬件都是下游硬件的緩存,因此我們可以說寄存器是下游存儲設(shè)備的緩存。
寄存器的本質(zhì):本質(zhì)是在硬件層面上,提高計算機的運算效率。
什么變量可以用register
1.局部變量(全局變量導(dǎo)致CPU寄存器被長時間占用)
2.不會被寫入(寫入就要寫回內(nèi)存,要重新加載,無意義)
3.被高頻使用(提高效率所在,放在寄存器,不用訪存讀取,提高效率)
int main() { register int val = 100; //寄存器變量沒有地址,不能取地址 val = 200; //可以被寫入 printf("%d\n", val); // 在gcc編譯器下 也不允許取地址 return 0; }
提示:不要大量使用register,因為寄存器的數(shù)量有限。
由于使用register關(guān)鍵字,直接將val存在寄存器內(nèi),因此val沒有內(nèi)存地址,因此不能進行取地址操作。
總結(jié):
包括作用域,生命周期,auto和register關(guān)鍵字的理解是使用。
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
詳解C++中的vector容器及用迭代器訪問vector的方法
使用迭代器iterator可以更方便地解引用和訪問成員,當然也包括vector中的元素,本文就來詳解C++中的vector容器及用迭代器訪問vector的方法,需要的朋友可以參考下2016-05-05解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型
虛擬函數(shù)(Visual Function)亦常被成為虛函數(shù),是C++中的一個重要特性,本文我們就來解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型2016-06-06Qt實現(xiàn)SqlRelationalTable關(guān)聯(lián)表組件
在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹SqlRelationalTable關(guān)聯(lián)表組件的常用方法及靈活運用,感興趣的可以了解一下2023-12-12