最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言?auto和register關(guān)鍵字

 更新時間:2022年04月14日 13:14:24   作者:野豬佩奇`  
這篇文章主要介紹了C語言?auto、register關(guān)鍵字,文章通過變量展開全文相關(guān)的詳細(xì)內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下

一、關(guān)鍵字分類

C語言一共多少個關(guān)鍵字呢?一般的書上,都是32個(包括本書),但是這個都是C90(C89)的標(biāo)準(zhǔn)。其實C99后又新增了5個關(guān)鍵字。不過,目前主流的編譯器,對C99支持的并不好,我們后面默認(rèn)情況,使用C90,即,認(rèn)為32個

二、補充內(nèi)容

在正式開始講解關(guān)鍵字之前,我們需要了解下面這些基本概念

1、變量的分類

變量分為全局變量和局部變量

局部變量:定義在代碼塊中的變量叫做局部變量。局部變量具有臨時性。進(jìn)入代碼塊,自動形成局部變量,退出代碼塊自動 釋放。[網(wǎng)上很多說函數(shù)中的變量是局部變量,不能說錯,但說法是不準(zhǔn)確的]

全局變量:在所有函數(shù)外定義的變量,叫做全局變量。全局變量具有全局性。

注:代碼塊 — 在函數(shù)中,用{}括起來的區(qū)域,就叫做代碼塊,代碼塊可以嵌套

2、變量的作用域與生命周期

作用域概念:指該變量可以被正常訪問的代碼區(qū)域

全局變量的作用域:在整個程序運行期間都有效

局部變量的作用域:只在局部變量所在的代碼塊內(nèi)有效

生命周期概念:指的是該變量從定義開辟空間到釋放的時間范圍,所謂的釋放,指的是曾經(jīng)開辟的空間”被釋放“。

全局變量的生命周期:定義完成之后,程序運行的整個生命周期內(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); ?//報錯,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); //輸出的是局部,也就是局部和全部同名的時候,優(yōu)先局部。
?
?? ?return 0;
}

總結(jié):作用域是空間上的概念,表示該變量能夠被有效訪問或使用的區(qū)域

生命周期是時間上的概念,表示該變量空間什么時候被開辟,什么時候被釋放

當(dāng)局部變量和全局變量重復(fù)出現(xiàn)時,局部變量優(yōu)先(就近原則) 

三、最寬宏大量的關(guān)鍵字 -- auto

1、如何使用:一般在代碼塊中定義的變量,即局部變量,默認(rèn)都是auto修飾的,不過一般省略,但不是所有的變量默認(rèn)都是auto修飾的,auto一般只用來修飾局部變量

2、用法:auto關(guān)鍵字比較古老,一般我們在定義變量的時候直接省略即可

3、總結(jié):auto用來修飾局部變量,表示該局部變量的生命周期和作用域只在該代碼塊內(nèi)有效,可以省略,不能用來修飾全局變量。

#include<stdio.h>
auto int b = 10; ?//報錯,auto 不能用來修飾全局變量
int main()
{
?? ?auto int a = 30; // 等價于 int a = 30;
}

四、最快的關(guān)鍵字 -- register

1、存儲分級

在計算機(jī)內(nèi)部,越靠近CPU的存儲單元的運行速度越快,但其相對單位制造成本也越高,越遠(yuǎn)離CPU的存儲單元運行速度越慢,單位造價越低,為了以最小的成本,達(dá)到最大的CPU運行效率,出現(xiàn)了存儲分級的辦法。

2、寄存器

寄存器存在的原因:CPU主要是負(fù)責(zé)進(jìn)行計算的硬件單元,但是為了方便運算,一般第一步需要先把數(shù)據(jù)從內(nèi)存讀取到CPU內(nèi),那么也就需要CPU具有一定的數(shù)據(jù)臨時存儲能力,但是CPU并不是當(dāng)前要計算了,才把特定數(shù)據(jù)讀到CPU里面,因為那樣太慢了。 所以現(xiàn)代CPU內(nèi),都集成了一組叫做寄存器的硬件,用來做臨時數(shù)據(jù)的保存。

寄存器存在的本質(zhì): 在硬件層面上,提高計算機(jī)的運算效率。因為不需要再從內(nèi)存里讀取數(shù)據(jù)。

3、register修飾變量

register修飾變量的作用:盡量將所修飾變量,放入CPU寄存區(qū)中,從而達(dá)到提高效率的目的

register修飾變量提高效率的本質(zhì):將變量放入寄存器中,使CPU可以直接對該數(shù)據(jù)進(jìn)行操作,而不需要從內(nèi)存中對其進(jìn)行讀取。

既然用register修飾的變量可以提高效率,那么是不是所以的變量都最好用register修飾呢?答案當(dāng)然不是的。因為寄存器的數(shù)量是有限的,大量使用register修飾反而會降低程序的運行效率。那么什么樣的變量應(yīng)該被register修飾呢?

  • (1)局部的(全局會導(dǎo)致CPU寄存器被長時間占用)
  • (2)不會被寫入的(對數(shù)據(jù)進(jìn)行寫入需要將數(shù)據(jù)重新加載進(jìn)內(nèi)存,這樣也就失去了把數(shù)據(jù)放進(jìn)寄存器當(dāng)中的意義)
  • (3)需要被高頻讀取的(直接從寄存器中對該數(shù)據(jù)進(jìn)行讀取,提高效率)

注意:

  • (1)被register修飾的變量,不能取地址(因為該變量已經(jīng)被放在寄存區(qū)中,而地址是內(nèi)存相關(guān)的概念)
  • (2)register只是一個建議性的關(guān)鍵字,建議計算機(jī)將該變量放入內(nèi)存之中,不是強制性的,也就是說,雖然一個變量已經(jīng)被register修飾了,但是該變量還是可能被繼續(xù)放在內(nèi)存當(dāng)中
  • (3)如果要使用register,請不要大量使用,因為寄存器數(shù)量有限
#include <stdio.h>
int main()
{
?? ?register int a = 0;
?? ?printf("&a = %p\n", &a);
?? ?//編譯器報錯:錯誤 1 error C2103: 寄存器變量上的“&”
?? ?//注意,這里不是所有的編譯器都報錯,目前我們的vs2022是報錯的。
?? ?return 0;
}

到此這篇關(guān)于C語言 auto和register關(guān)鍵字的文章就介紹到這了,更多相關(guān)C語言auto、register內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Effective?C++?學(xué)習(xí)筆記

    Effective?C++?學(xué)習(xí)筆記

    這篇文章主要介紹了Effective?C++?學(xué)習(xí)筆記,想學(xué)習(xí)Effective?C++的朋友可以參考一下
    2023-08-08
  • C++命名空間5種常見用法實例解析

    C++命名空間5種常見用法實例解析

    這篇文章主要介紹了C++命名空間5種常見用法實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • C語言零基礎(chǔ)徹底掌握預(yù)處理上篇

    C語言零基礎(chǔ)徹底掌握預(yù)處理上篇

    在C語言的程序中包括各種以符號#開頭的編譯指令,這些指令稱為預(yù)處理命令。預(yù)處理命令屬于C語言編譯器,而不是C語言的組成部分,通過預(yù)處理命令可擴(kuò)展C語言程序設(shè)計的環(huán)境
    2022-08-08
  • C++中檢查vector是否包含給定元素的幾種方式詳解

    C++中檢查vector是否包含給定元素的幾種方式詳解

    這篇文章主要介紹了C++中檢查vector是否包含給定元素的幾種方式,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Qt使用事件與定時器實現(xiàn)字幕滾動效果

    Qt使用事件與定時器實現(xiàn)字幕滾動效果

    我們經(jīng)常能夠在外面看到那種滾動字幕,那么本文就拿Qt來做一個吧,本文將使用事件與定時器實現(xiàn)字幕滾動的效果,感興趣的小伙伴可以了解一下
    2023-06-06
  • C利用語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)之隊列

    C利用語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)之隊列

    隊列 (Queue):簡稱隊,是另一種限定性的線性表,它只允許在表的一端插入元素,而在另一端刪除元素。q=(a1, a2, a3, … an),其中a1為隊頭,an為隊尾,下面文章小編將為大家詳細(xì)介紹,需要的下伙伴可以參考一下
    2021-10-10
  • 深入了解c++11 移動語義與右值引用

    深入了解c++11 移動語義與右值引用

    這篇文章主要介紹了c++ 移動語義與右值引用的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • Qt利用QState狀態(tài)機(jī)實現(xiàn)控件互斥操作詳解

    Qt利用QState狀態(tài)機(jī)實現(xiàn)控件互斥操作詳解

    這篇文章主要為大家詳細(xì)介紹了Qt如何利用QState狀態(tài)機(jī)實現(xiàn)控件互斥操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-12-12
  • C++私有繼承(二)

    C++私有繼承(二)

    這篇文章主要介紹了C++私有繼承,在私有繼承時,基類的公有對象以及保護(hù)對象會變成派生類的私有對象。我們可以在派生類方法當(dāng)中使用它,但無法通過派生類對象直接調(diào)用,但無法訪問基類的私有方法和對象,下面具體內(nèi)容,需要的朋友可以參考一下
    2022-01-01
  • mfc入門教程之通過控制變量制作計算器

    mfc入門教程之通過控制變量制作計算器

    這篇文章主要介紹了mfc入門教程之通過控制變量制作計算器,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04

最新評論

肥城市| 扶风县| 西华县| 兴隆县| 军事| 休宁县| 安岳县| 曲水县| 德江县| 宜都市| 乌海市| 外汇| 德钦县| 仁化县| 凌海市| 玉屏| 芒康县| 曲阳县| 湘潭市| 东乡县| 包头市| 托克托县| 自贡市| 离岛区| 徐闻县| 清河县| 宿州市| 兴宁市| 布拖县| 三穗县| 康定县| 大田县| 新沂市| 嵊泗县| 修武县| 托克逊县| 读书| 石家庄市| 奈曼旗| 梁河县| 抚顺县|