C語言?auto和register關(guān)鍵字
一、關(guān)鍵字分類
C語言一共多少個(gè)關(guān)鍵字呢?一般的書上,都是32個(gè)(包括本書),但是這個(gè)都是C90(C89)的標(biāo)準(zhǔn)。其實(shí)C99后又新增了5個(gè)關(guān)鍵字。不過,目前主流的編譯器,對(duì)C99支持的并不好,我們后面默認(rèn)情況,使用C90,即,認(rèn)為32個(gè)
二、補(bǔ)充內(nèi)容
在正式開始講解關(guān)鍵字之前,我們需要了解下面這些基本概念
1、變量的分類
變量分為全局變量和局部變量
局部變量:定義在代碼塊中的變量叫做局部變量。局部變量具有臨時(shí)性。進(jìn)入代碼塊,自動(dòng)形成局部變量,退出代碼塊自動(dòng) 釋放。[網(wǎng)上很多說函數(shù)中的變量是局部變量,不能說錯(cuò),但說法是不準(zhǔn)確的]
全局變量:在所有函數(shù)外定義的變量,叫做全局變量。全局變量具有全局性。
注:代碼塊 — 在函數(shù)中,用{}括起來的區(qū)域,就叫做代碼塊,代碼塊可以嵌套
2、變量的作用域與生命周期
作用域概念:指該變量可以被正常訪問的代碼區(qū)域
全局變量的作用域:在整個(gè)程序運(yùn)行期間都有效
局部變量的作用域:只在局部變量所在的代碼塊內(nèi)有效
生命周期概念:指的是該變量從定義開辟空間到釋放的時(shí)間范圍,所謂的釋放,指的是曾經(jīng)開辟的空間”被釋放“。
全局變量的生命周期:定義完成之后,程序運(yùn)行的整個(gè)生命周期內(nèi),該變量一直都有效
局部變量的生命周期:進(jìn)入代碼塊,形成局部變量[開辟空間],退出代碼塊,"釋放"局部變量
#include<stdio.h> int g_val = 10; ? //g_val 在所有函數(shù)外部定義,是全局變量 int main() { ?? ?int a = 20; ? ?//a 在main函數(shù)內(nèi)部定義,是局部變量 ?? ?printf("%d\n", g_val); ?? ?printf("%d\n", a); ?? ?return 0; }
#include<stdio.h> int g_val = 100; int main() { ?? ?int x = 10; ?? ?if (x == 10) ?? ?{ ?? ??? ?int y = 20; ?? ??? ?pritnf("%d %d", x, y); ? //可以 ?? ?} ?? ?pritnf("%d %d", x, y); ?//報(bào)錯(cuò),y只能在 if 代碼塊內(nèi)部被訪問 }
#include <stdio.h> int g_x = 100; //全局變量 void show() { ?? ?printf("show: 全局: %d\n", g_x); //在任何代碼塊中都可以被訪問 } int main() { ?? ?show(); ?? ?printf("main: 全局: %d\n", g_x); //在任何代碼塊中都可以被訪問,甚至被修改 ?? ?return 0; }
#include<stdio.h> int g_x = 100; //全局變量 int main() { ?? ?int g_x = 10; //局部變量,與全局同名 ?? ??? ?printf("g_x:%d\n", g_x); //輸出的是局部,也就是局部和全部同名的時(shí)候,優(yōu)先局部。 ? ?? ?return 0; }
總結(jié):作用域是空間上的概念,表示該變量能夠被有效訪問或使用的區(qū)域
生命周期是時(shí)間上的概念,表示該變量空間什么時(shí)候被開辟,什么時(shí)候被釋放
當(dāng)局部變量和全局變量重復(fù)出現(xiàn)時(shí),局部變量優(yōu)先(就近原則)
三、最寬宏大量的關(guān)鍵字 -- auto
1、如何使用:一般在代碼塊中定義的變量,即局部變量,默認(rèn)都是auto修飾的,不過一般省略,但不是所有的變量默認(rèn)都是auto修飾的,auto一般只用來修飾局部變量
2、用法:auto關(guān)鍵字比較古老,一般我們?cè)诙x變量的時(shí)候直接省略即可
3、總結(jié):auto用來修飾局部變量,表示該局部變量的生命周期和作用域只在該代碼塊內(nèi)有效,可以省略,不能用來修飾全局變量。
#include<stdio.h> auto int b = 10; ?//報(bào)錯(cuò),auto 不能用來修飾全局變量 int main() { ?? ?auto int a = 30; // 等價(jià)于 int a = 30; }
四、最快的關(guān)鍵字 -- register
1、存儲(chǔ)分級(jí)
在計(jì)算機(jī)內(nèi)部,越靠近CPU的存儲(chǔ)單元的運(yùn)行速度越快,但其相對(duì)單位制造成本也越高,越遠(yuǎn)離CPU的存儲(chǔ)單元運(yùn)行速度越慢,單位造價(jià)越低,為了以最小的成本,達(dá)到最大的CPU運(yùn)行效率,出現(xiàn)了存儲(chǔ)分級(jí)的辦法。
2、寄存器
寄存器存在的原因:CPU主要是負(fù)責(zé)進(jìn)行計(jì)算的硬件單元,但是為了方便運(yùn)算,一般第一步需要先把數(shù)據(jù)從內(nèi)存讀取到CPU內(nèi),那么也就需要CPU具有一定的數(shù)據(jù)臨時(shí)存儲(chǔ)能力,但是CPU并不是當(dāng)前要計(jì)算了,才把特定數(shù)據(jù)讀到CPU里面,因?yàn)槟菢犹恕?所以現(xiàn)代CPU內(nèi),都集成了一組叫做寄存器的硬件,用來做臨時(shí)數(shù)據(jù)的保存。
寄存器存在的本質(zhì): 在硬件層面上,提高計(jì)算機(jī)的運(yùn)算效率。因?yàn)椴恍枰購膬?nèi)存里讀取數(shù)據(jù)。
3、register修飾變量
register修飾變量的作用:盡量將所修飾變量,放入CPU寄存區(qū)中,從而達(dá)到提高效率的目的
register修飾變量提高效率的本質(zhì):將變量放入寄存器中,使CPU可以直接對(duì)該數(shù)據(jù)進(jìn)行操作,而不需要從內(nèi)存中對(duì)其進(jìn)行讀取。
既然用register修飾的變量可以提高效率,那么是不是所以的變量都最好用register修飾呢?答案當(dāng)然不是的。因?yàn)榧拇嫫鞯臄?shù)量是有限的,大量使用register修飾反而會(huì)降低程序的運(yùn)行效率。那么什么樣的變量應(yīng)該被register修飾呢?
- (1)局部的(全局會(huì)導(dǎo)致CPU寄存器被長時(shí)間占用)
- (2)不會(huì)被寫入的(對(duì)數(shù)據(jù)進(jìn)行寫入需要將數(shù)據(jù)重新加載進(jìn)內(nèi)存,這樣也就失去了把數(shù)據(jù)放進(jìn)寄存器當(dāng)中的意義)
- (3)需要被高頻讀取的(直接從寄存器中對(duì)該數(shù)據(jù)進(jìn)行讀取,提高效率)
注意:
- (1)被register修飾的變量,不能取地址(因?yàn)樵撟兞恳呀?jīng)被放在寄存區(qū)中,而地址是內(nèi)存相關(guān)的概念)
- (2)register只是一個(gè)建議性的關(guān)鍵字,建議計(jì)算機(jī)將該變量放入內(nèi)存之中,不是強(qiáng)制性的,也就是說,雖然一個(gè)變量已經(jīng)被register修飾了,但是該變量還是可能被繼續(xù)放在內(nèi)存當(dāng)中
- (3)如果要使用register,請(qǐng)不要大量使用,因?yàn)榧拇嫫鲾?shù)量有限
#include <stdio.h> int main() { ?? ?register int a = 0; ?? ?printf("&a = %p\n", &a); ?? ?//編譯器報(bào)錯(cuò):錯(cuò)誤 1 error C2103: 寄存器變量上的“&” ?? ?//注意,這里不是所有的編譯器都報(bào)錯(cuò),目前我們的vs2022是報(bào)錯(cuò)的。 ?? ?return 0; }
到此這篇關(guān)于C語言 auto和register關(guān)鍵字的文章就介紹到這了,更多相關(guān)C語言auto、register內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
QTableWidget設(shè)置只讓某一列可編輯的實(shí)現(xiàn)
本文介紹了如何將QTableWidget的某一列設(shè)置為可編輯,以便用戶可以輸入自定義數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08C++標(biāo)準(zhǔn)模板庫函數(shù)sort的那些事兒
sort函數(shù)是標(biāo)準(zhǔn)模板庫的函數(shù),已知開始和結(jié)束的地址即可進(jìn)行排序,可以用于比較任何容器(必須滿足隨機(jī)迭代器),任何元素,任何條件,執(zhí)行速度一般比qsort要快2013-09-09C++實(shí)現(xiàn)完整功能的通訊錄管理系統(tǒng)詳解
來了來了,通訊錄管理系統(tǒng)踏著七彩祥云飛來了,結(jié)合前面的結(jié)構(gòu)體知識(shí)和分文件編寫方法,我總結(jié)并碼了一個(gè)帶菜單的通訊錄管理系統(tǒng),在這篇文章中將會(huì)提到C的清空屏幕函數(shù),嵌套結(jié)構(gòu)體具體實(shí)現(xiàn),簡單且充實(shí),跟著我的思路,可以很清晰的解決這個(gè)項(xiàng)目2022-05-05VS C++頭文件引用提示“未定義標(biāo)識(shí)符”的問題解決
本文主要介紹了VS C++頭文件引用提示“未定義標(biāo)識(shí)符”的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07C++基礎(chǔ)入門教程(七):一些比較特別的基礎(chǔ)語法總結(jié)
這篇文章主要介紹了C++基礎(chǔ)入門教程(七):一些比較特別的基礎(chǔ)語法總結(jié),本文總結(jié)的都是一些特殊的語法,需要的朋友可以參考下2014-11-11