C語言深度解剖篇之關(guān)鍵字以及補(bǔ)充內(nèi)容
關(guān)鍵字分類
一般的書上,C語言的關(guān)鍵字都是32個,但是這個都是 C90(C89) 的標(biāo)準(zhǔn)。其實(shí) C99 后又新增了5個關(guān)鍵字。不過,目前主流的編譯器,對 C99 支持的并不好,按照C90標(biāo)準(zhǔn) ,即認(rèn)為32個。
| 關(guān)鍵字 | 說明 |
|---|---|
| auto | 聲明自動變量 |
| short | 聲明短整型變量或函數(shù) |
| int | 聲明整型變量或函數(shù) |
| long | 聲明長整型變量或函數(shù) |
| float | 聲明浮點(diǎn)型變量或函數(shù) |
| double | 聲明雙精度變量或函數(shù) |
| char | 聲明字符型變量或函數(shù) |
| struct | 聲明結(jié)構(gòu)體變量或函數(shù) |
| union | 聲明共用數(shù)據(jù)類型 |
| enum | 聲明枚舉類型 |
| typedef | 用以給數(shù)據(jù)類型取別名 |
| const | 聲明只讀變量 |
| unsigned | 聲明無符號類型變量或函數(shù) |
| signed | 聲明有符號類型變量或函數(shù) |
| extern | 聲明變量是在其他文件正聲明 |
| register | 聲明寄存器變量 |
| static | 聲明靜態(tài)變量 |
| volatile | 說明變量在程序執(zhí)行中可被隱含地改變 |
| void | 聲明函數(shù)無返回值或無參數(shù),聲明無類型指針 |
| if | 條件語句 |
| else | 條件語句否定分支(與 if 連用) |
| switch | 用于開關(guān)語句 |
| case | 開關(guān)語句分支 |
| for | 一種循環(huán)語句 |
| do | 循環(huán)語句的循環(huán)體 |
| while | 循環(huán)語句的循環(huán)條件 |
| goto | 無條件跳轉(zhuǎn)語句 |
| continue | 結(jié)束當(dāng)前循環(huán),開始下一輪循環(huán) |
| break | 跳出當(dāng)前循環(huán) |
| default | 開關(guān)語句中的“其他”分支 |
| sizeof | 計(jì)算數(shù)據(jù)類型長度 |
| return | 子程序返回語句(可以帶參數(shù),也可不帶參數(shù))循環(huán)條件 |
補(bǔ)充內(nèi)容
第一個C程序
#include<stdio.h>
#include<windows.h>//windows.h系統(tǒng)頭文件,僅僅是為了停屏
int main()
{
printf("hello world!\n");
system("pause");//pause停屏
return 0;
}
文件代碼在進(jìn)行生成解決方案后會轉(zhuǎn)換成可執(zhí)行程序(二進(jìn)制文件 .exe)

可以通過清空解決方案來清空可執(zhí)行程序

- 在windows中,雙擊的本質(zhì)運(yùn)行程序,將程序加載到內(nèi)存中。
- 任何程序在被被運(yùn)行之前都必須被加載到內(nèi)存當(dāng)中。
- 加載到內(nèi)存中,速度快。
馮諾依曼

定義與聲明
變量
在內(nèi)存中開辟特定大小的空間,用來保存數(shù)據(jù)
變量的定義
類型 變量名 = 默認(rèn)值 int a = 10; char c = 'c';
定義變量的原因:因?yàn)橛袛?shù)據(jù)需要暫時被保存起來,等待后續(xù)處理。
變量的本質(zhì)
- 所有的變量的本質(zhì)都是要在內(nèi)存的某個位置開辟空間的。
- 程序運(yùn)行,需要加載到內(nèi)存中
- 程序計(jì)算,需要使用變量
定義變量的本質(zhì):在內(nèi)存中開辟一塊空間,用來保存數(shù)據(jù)。(為何一定是內(nèi)存:因?yàn)槎x變量,也是程序邏輯的一部分,程序已經(jīng)被加載到內(nèi)存)
定義:開辟空間,只能有一次。
聲明:告知,可以多次。
int a = 10;//a的定義 a = 20;//賦值 a = 100;//賦值
變量的分類
變量分為:局部變量和全局變量
局部變量:包含在代碼塊中的變量叫做局部變量。局部變量具有臨時性。進(jìn)入代碼塊,自動形成局部變量,退出代碼塊自動釋放。[網(wǎng)上很多說函數(shù)中的變量是局部變量,不能說錯,但說法是不準(zhǔn)確的](定義在代碼塊內(nèi))
全局變量:在所有函數(shù)外定義的變量,叫做全局變量。全局變量具有全局性。(定義在代碼塊外)
代碼塊:用{}括起來的區(qū)域,就叫做代碼塊
#include<stdio.h>
int g_val = 100;//全局變量
int main()
{
int a = 10;//局部變量,main函數(shù)也是函數(shù),也有代碼塊{}
if(a == 10)
{
int b = 10;//局部變量
}
printf("a=%d\n", a);
return 0;
}
變量的作用域
作用域:指的是該變量的可以被正常訪問的代碼區(qū)域。
局部變量:只在本代碼塊內(nèi)有效。
全局變量:整個程序運(yùn)行期間,都有效。
其中全局變量:
- 在任何代碼塊中都可以被訪問
- 在任何代碼塊中都可以被訪問,甚至被修改。
- 當(dāng)全局變量與局部變量同名時,局部變量優(yōu)先。
#include<stdio.h>
int g_vax = 10;//全局變量
void test()
{
int g_val = 100;//局部變量的g_val只能在本代碼被訪問
printf("%d\n", g_val);//在全局變量g_val任何代碼塊中都可以被訪問,甚至被修改
//輸出的是局部,也就是局部和全部同名的時候,優(yōu)先局部。
}
int main()
{
test();
printf("%d\n", g_vax);//在任何代碼塊中都可以被訪問
return 0;
}

變量的生命周期
生命周期概念:指的是該變量從定義到被釋放的時間范圍,所謂的釋放,指的是曾經(jīng)開辟的空間”被釋放“。
局部變量: 進(jìn)入代碼塊,形成局部變量[開辟空間],退出代碼塊,"釋放"局部變量。
全局變量: 定義完成之后,程序運(yùn)行的整個生命周期內(nèi),該變量一直都有效。
作用域 vs 生命周期
作用域:衡量變量影響的范圍,該變量的有效作用域。
生命周期:描述的是變量生存時間的長短。時間的概念:什么時候被開辟,什么時候被釋放。

最寬宏大量的關(guān)鍵字 - auto
如何使用:一般在代碼塊中定義的變量,即局部變量,默認(rèn)都是auto修飾的,不過一般省略。
默認(rèn)的所有變量都是auto嗎?不是,一般用來修飾局部變量
局部變量包括自動變量,臨時變量和局部變量。
#include <stdio.h>
int main()
{
for (int i = 0; i < 10; i++) //局部變量i也可以被auto修飾
{
printf("i=%d\n", i);
if (1)
{
auto int j = 0;//自動變量
printf("before: j=%d\n", j);
j += 1;
printf("after : j=%d\n", j);
}
}
return 0;
}

auto已經(jīng)很老,基本上不使用了。
最快的關(guān)鍵字 - register
CPU主要是負(fù)責(zé)進(jìn)行計(jì)算的硬件單元,但是為了方便運(yùn)算,一般第一步需要先把數(shù)據(jù)從內(nèi)存讀取到CPU內(nèi),那么也就需要CPU具有一定的數(shù)據(jù)臨時存儲能力。注意:CPU并不是當(dāng)前要計(jì)算了,才把特定數(shù)據(jù)讀到CPU里面,那樣太慢了。
所以現(xiàn)代CPU內(nèi),都集成了一組叫做寄存器的硬件,用來做臨時數(shù)據(jù)的保存。
存儲金字塔

距離CPU越近的存儲硬件,速度越快。
寄存器的認(rèn)識
CPU內(nèi)集成了一組存儲硬件即可,這組硬件叫做寄存器。
寄存器存在的本質(zhì)
在硬件層面上,提高計(jì)算機(jī)的運(yùn)算效率。因?yàn)椴恍枰獜膬?nèi)存里讀取數(shù)據(jù)啦。
register 修飾變量
盡量將所修飾變量,放入CPU寄存區(qū)中,從而達(dá)到提高效率的目的
那么什么樣的變量,可以采用register呢?
1.局部的(全局會導(dǎo)致CPU寄存器被長時間占用)
2.不會被寫入的(寫入就需要寫回內(nèi)存,后續(xù)還要讀取檢測的話,就無意義了)
3.高頻被讀取的(提高效率所在)
4.如果要使用,請不要大量使用,因?yàn)榧拇嫫鲾?shù)量有限
5.register修飾的變量,不能取地址(因?yàn)橐呀?jīng)放在寄存區(qū)中了嘛,地址是內(nèi)存相關(guān)的概念)
寄存器–cache–內(nèi)存–SSD/flash/硬盤–光盤–磁盤
硬盤通過緩存技術(shù)成內(nèi)存,內(nèi)存通過緩存技術(shù)成寄存器。
距離CPU越近的儲存單元,效率越高,單價(jià)成本越高。
距離CPU越遠(yuǎn)的儲存單元,效率越低,單價(jià)成本越便宜。
對任何一種硬件而言,充當(dāng)上游硬件的緩存。
例:內(nèi)存可以看成硬盤的一個大緩存;cache和寄存器相當(dāng)于內(nèi)存某一種緩存。
CPU訪問數(shù)據(jù)的時,以最小的成本達(dá)到最高的效率。
#include<stdio.h>
int main()
{
register int a = 10;
printf("%p\n", &a);
return 0;
}

寫在最后
到此這篇關(guān)于C語言深度解剖篇之關(guān)鍵字以及補(bǔ)充內(nèi)容的文章就介紹到這了,更多相關(guān)C語言關(guān)鍵字及補(bǔ)充內(nèi)容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual Studio 2019 Professional 激活方法詳解
這篇文章主要介紹了Visual Studio 2019 Professional 激活方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
java 出現(xiàn)NullPointerException的原因及解決辦法
這篇文章主要介紹了java 出現(xiàn)NullPointerException的原因及解決辦法的相關(guān)資料,這里說明出現(xiàn)NullPointerException 的原因的總結(jié),并說明該如何解決,需要的朋友可以參考下2017-08-08
簡要對比C語言中的truncate()函數(shù)與ftruncate()函數(shù)
這篇文章主要介紹了C語言中的truncate()函數(shù)與ftruncate()函數(shù)的簡要對比,注意其之間的區(qū)別,需要的朋友可以參考下2015-09-09

