最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

解開C語言的秘密《關(guān)鍵字》(第一期)

2022-06-25 13:11 作者:程序猿教你打籃球  | 我要投稿

本期內(nèi)容充分用到實(shí)例講解,會(huì)更深層次的講解本期關(guān)鍵字,可能會(huì)讓你有意想不到的收獲,希望每位小伙伴在讀任何技術(shù)文章的時(shí)候都能抱著一個(gè)空杯心態(tài),這樣收獲比可能比你想得要多!

首先我們來了解C語言一共有多少個(gè)關(guān)鍵字呢?

在我們一般書籍的介紹中,一共有32個(gè)關(guān)鍵字,這些是基于C90(C89)的標(biāo)準(zhǔn),但是在后面的C99標(biāo)準(zhǔn)中新增了5個(gè)關(guān)鍵字,不過目前主流的編譯器其實(shí)對C99的支持并不友好,所以暫時(shí)可以先不了解。

1、變量的認(rèn)識

1.1變量的聲明和定義

定義變量的本質(zhì):在內(nèi)存中開辟一塊空間,用來保存數(shù)據(jù)。

如何定義變量相信大家都知道了,這個(gè)我就不細(xì)說了,但是我發(fā)現(xiàn)有的學(xué)校老師寫main函數(shù)的時(shí)候返回值為void或者直接不寫返回值,這樣有錯(cuò)嗎?其實(shí)嚴(yán)格意義上這是不規(guī)范的寫法的?。–/C++標(biāo)準(zhǔn)規(guī)定main 函數(shù)的返回值應(yīng)該定義為 int 類型)如果現(xiàn)在有的書上還是void main我建議你考慮扔掉那本書??,那么標(biāo)準(zhǔn)的main函數(shù)的寫法是什么呢?見代碼:

其實(shí)這里你 return 1; 或者任何數(shù)都沒問題包括負(fù)數(shù)編譯器都不會(huì)報(bào)錯(cuò),但是,我們C語言從開始到現(xiàn)在以來,已經(jīng)約定了規(guī)矩,如果程序是異常結(jié)束則返回非0值,程序正常結(jié)束則返回0!就像我們?nèi)ト魏我粋€(gè)地方要尊重當(dāng)?shù)氐牧?xí)俗一樣!

接著我們來理解變量的聲明:

這里我給大家簡單舉一個(gè)例子,張三喜歡上了隔壁學(xué)院的小美,在某一天晚上張三鼓起勇氣跟小美告白,于是小美成為了張三的女朋友,這就叫做定義!那么張三晚上回寢室特別開心,他把這個(gè)消息告訴了室友李四,也告訴了隔壁寢室的王五,甚至還打電話告訴了她的媽媽,張三給任何人聲明小美就是他女朋友,那么這就叫做聲明!

聲明可以有多次,代碼塊內(nèi)定義只能有一次!(詳細(xì)內(nèi)容放在extern講解)

1.2全局變量和局部變量

變量我們可以分為局部變量和全局變量:

局部變量:包含在代碼塊中的變量叫局部變量,同時(shí)局部變量具有臨時(shí)性,當(dāng)它進(jìn)入代碼塊的時(shí)候會(huì)自動(dòng)開辟空間,退出代碼塊會(huì)自動(dòng)釋放。

全局變量:在所有函數(shù)外定義的變量叫做全局變量,全局變量具有全局性,聲明周期從整個(gè)進(jìn)程開始到進(jìn)程結(jié)束。


1.2變量的作用域和生命周期?

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

?變量的生命周期:指的是該變量從定義到被釋放的時(shí)間范圍!

? ? ? ? ? ? ? ? ? ? ? ? ? ???*局部變量:進(jìn)入代碼塊,形成局部變量到退出代碼塊

? ? ? ? ? ? ? ? ? ? ? ? ? ??*全局變量:?定義完成之后,程序運(yùn)行的整個(gè)生命周期內(nèi),該變量一直都有

這里我們先簡單了解概念,講static關(guān)鍵字會(huì)帶入進(jìn)去以上概念。

2、跑的飛快?---------?register(理解)

?見名知意,為什么叫跑的飛快,讓然是非???!首先我們先來看一幅圖:

在我們先認(rèn)識register這個(gè)關(guān)鍵字之前先了解一個(gè)概念,計(jì)算機(jī)中CPU是主要負(fù)責(zé)進(jìn)行計(jì)算的硬件單元,但是為了運(yùn)算方面,我們一般要先把數(shù)據(jù)硬盤讀取到內(nèi)存中,再從內(nèi)存中讀取到CPU內(nèi),那么CPU也就需要一定的數(shù)據(jù)臨時(shí)存儲(chǔ)能力,所以現(xiàn)代的CPU內(nèi),都集成了一組叫做寄存器的硬件,用來做臨時(shí)數(shù)據(jù)的保存,那么我們?nèi)绻炎兞糠旁诩拇嫫髦校挥猛ㄟ^從內(nèi)存中讀取這個(gè)步驟的話是不是會(huì)更快呢?

寄存器存在的本質(zhì):在硬件層面上,提高計(jì)算機(jī)的運(yùn)算效率。因?yàn)椴恍枰獜膬?nèi)存讀取數(shù)據(jù)!

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

那么所有變量適合采用register修飾嗎?并不是!

  • 局部變量(全局變量會(huì)導(dǎo)致CPU寄存器長時(shí)間被占用)

  • 不會(huì)被寫入的(寫入就需要寫回內(nèi)存,后續(xù)還要讀取檢測的話,register的意義在哪呢?)

  • 需要高頻被讀取的(提高效率所在)

建議:如果要使用,請不要大量使用,因?yàn)榧拇嫫鲾?shù)量有限!

來到這里我們要注意一個(gè)問題,既然被register修飾的變量會(huì)被放到CPU寄存器中,那么它還可以進(jìn)行取地址操作嗎???

這里我們win vs編譯器的環(huán)境下顯然是不可以的!

為什么呢?因?yàn)榈刂肥莾?nèi)存上的概念。(其他環(huán)境未測試)。

最后:這個(gè)關(guān)鍵字在目前來看,已經(jīng)不重要了,主流的編譯器已經(jīng)很智能了,能夠進(jìn)行比人更好的代碼優(yōu)化,我們只需要了解即可,不然面試官問你,你兩眼干瞪天花板咋辦???

3、告知對方?--------- extern(重點(diǎn))

我們先引入一個(gè)概念,如果說小伙伴們以后寫項(xiàng)目了,只會(huì)存在一個(gè).c文件嗎?那么全局變量,函數(shù)可以跨文件使用嗎?我們看代碼:

看上面的代碼,我們有兩個(gè)源文件,并且把函數(shù)寫在basketball.c,同時(shí)test.c文件文件調(diào)用此函數(shù),請問程序是否可以正常運(yùn)行?

我們直接讓我們代碼走起來,會(huì)出現(xiàn)警告但是代碼仍然可以強(qiáng)制運(yùn)行,但是這只是函數(shù),那我們的全局變量呢?也可以強(qiáng)制運(yùn)行嗎?

這里我們通過實(shí)驗(yàn)發(fā)現(xiàn),全局變量并不能像函數(shù)一樣可以跨文件直接使用,那么我們?nèi)绾谓鉀Q這個(gè)問題呢?這里不知道小伙伴們之前學(xué)C語言有沒有聽過一句話:先聲明,后使用!我們有基礎(chǔ)的都知道聲明是extern關(guān)鍵字,那么我們就在對應(yīng)的test.c里聲明一下g_val;

這里我們發(fā)現(xiàn),聲明的時(shí)候如果賦值那么就會(huì)報(bào)錯(cuò),為什么呢?因?yàn)槁暶鞑]有開辟空間!當(dāng) g_val = 100; 這樣寫的話叫做賦值或初始化,也就是上面我們說的定義只能定義一次!而聲明可以聲明多次!

那么我們正確聲明的寫法是什么呢?

由上可見,我們確實(shí)可以在多個(gè)文件中聲明g_val,同時(shí)每個(gè)文件都引用了<stdio.h>頭文件,但是萬一以后做項(xiàng)目很多個(gè).c文件我們還是要一一聲明嗎?每次都引用嗎?這樣就會(huì)大大減少我們程序的可維護(hù)性了!那么這里我們就要介紹.h頭文件了,那么我們?yōu)槭裁匆妙^文件呢?

如果我們單純使用源文件,組織項(xiàng)目結(jié)構(gòu)的時(shí)候,項(xiàng)目越大越復(fù)雜的時(shí)候,維護(hù)成本越高,在使用.h頭文件,組織項(xiàng)目結(jié)構(gòu)的時(shí)候,可以減少大型項(xiàng)目的維護(hù)成本問題!

見代碼:

頭文件:一般包含函數(shù)聲明,變量聲明,宏定義,頭文件等內(nèi)容

#pragma once預(yù)處理指令是為了防止頭文件重復(fù)包含,保證頭文件只被編譯一次!(目前了解即可)

函數(shù)聲明可以不帶extern(編譯器在發(fā)現(xiàn)函數(shù)沒有函數(shù)體會(huì)把它解釋稱聲明),但是我建議小伙伴們帶上,如果函數(shù)帶參,聲明也要帶參數(shù)!

變量聲明必須帶上extren(頭文件只能包含變量的聲明,不能包含變量的定義)。

4、名副其實(shí) ---------?static(重點(diǎn))

首先我們先來看這樣一個(gè)問題,全局變量可以跨文件訪問嗎?可以!函數(shù)可以跨文件訪問嗎?也可以!那么在具體的應(yīng)用場景中,有沒有可能我們不想讓全局變量或者函數(shù)跨文件放訪問,只在本文件內(nèi)部訪問。我們先來看一個(gè)例子:

當(dāng)我們發(fā)現(xiàn)用static修飾了全局變量后,接著運(yùn)行我們的代碼會(huì)報(bào)出鏈接錯(cuò)誤,得出:static修飾全局變量該變量只能在本文件內(nèi)被訪問,不能被外部其他文件直接訪問!但是我們可以間接訪問,如下代碼:

我們可以看到,我們在baketball.c文件里的Print函數(shù)里打印了被static修飾的全局變量,然后通過test.c文件調(diào)用了Print,這里我們可以看到仍然可以間接訪問被static修飾的全局變量,程序不會(huì)報(bào)錯(cuò)!

那么如果static修飾函數(shù)呢?會(huì)出現(xiàn)什么情況?

這里我們看到仍然會(huì)報(bào)跟上邊一樣的鏈接錯(cuò)誤,那么我們可以得出:static修飾函數(shù),該函數(shù)只能在本文件內(nèi)被訪問,不能在外部其他文件直接訪問!但是仍然可以間接訪問!

那么還有一個(gè)static修飾局部變量呢?會(huì)發(fā)生什么情況呢?我們看代碼:

此時(shí)我們fun函數(shù)是被static修飾了,那么它的代碼塊內(nèi)局部變量也會(huì)受影響嗎?答案是不會(huì)的,因?yàn)閕是局部變量,具有臨時(shí)性,函數(shù)調(diào)用開辟空間并初始化,函數(shù)結(jié)束,釋放空間!

當(dāng)我們用static修飾函數(shù)內(nèi)部局部變量會(huì)發(fā)生什么情況呢?

這里我們發(fā)現(xiàn)i的值并沒有被重置,也就是說在函數(shù)fun結(jié)束時(shí)i并沒有被釋放空間,那么為什么i不會(huì)被釋放呢?這里小伙伴們可以不懂可以看下我上一期博客的一個(gè)內(nèi)存分布圖快速排序,歸并排序?qū)е聴R绯鋈绾谓鉀Q?(非遞歸算法)_程序猿教你打籃球的博客-CSDN博客我們知道臨時(shí)變量都是放在棧區(qū)上的,但是一旦我們臨時(shí)變量被static修飾了就會(huì)被放到靜態(tài)區(qū),所以并不會(huì)被釋放,直到進(jìn)程結(jié)束!

那么通過上面的static修飾函數(shù)和全局變量以及局部變量,我們得出以下結(jié)論:

  • static修飾函數(shù)的時(shí)候,函數(shù)的外部鏈接屬性就被成了內(nèi)部鏈接屬性,那么它的作用域變小了,但是生命周期還是從進(jìn)入到銷毀(代碼塊)

  • static修飾全局變量的時(shí)候,全局變量的外部鏈接屬性就被成了內(nèi)部鏈接屬性,那么它的作用域變小了,但是生命周期還是整個(gè)進(jìn)程

  • static修飾局部變量的時(shí)候,局部變量內(nèi)部鏈接屬性并沒有被改變,也就是作用域沒有變,生命周期變成了整個(gè)進(jìn)程

本期幾個(gè)關(guān)鍵字的講解到這里就結(jié)束了,相信抱著空杯心態(tài)看完的你們肯定有所收獲吧,我們下期見,接著帶你們深度解剖C語言!?

解開C語言的秘密《關(guān)鍵字》(第一期)的評論 (共 條)

分享到微博請遵守國家法律
台中市| 武夷山市| 武平县| 五常市| 阿拉善左旗| 南部县| 东莞市| 淮滨县| 克什克腾旗| 白玉县| 三门峡市| 三原县| 潼南县| 滨州市| 临猗县| 金沙县| 常山县| 罗城| 潜江市| 宁河县| 丰顺县| 大关县| 江山市| 彝良县| 本溪市| 镇平县| 宜宾市| 中超| 牡丹江市| 重庆市| 民和| 平乐县| 巴楚县| 阿拉善左旗| 墨玉县| 四平市| 连江县| 团风县| 揭西县| 百色市| 五指山市|