C語言深度解剖篇之關鍵字以及補充內容

關鍵字分類

一般的書上,C語言的關鍵字都是32個,但是這個都是 C90(C89) 的標準。其實 C99 後又新增瞭5個關鍵字。不過,目前主流的編譯器,對 C99 支持的並不好,按照C90標準 ,即認為32個。

關鍵字 說明
auto 聲明自動變量
short 聲明短整型變量或函數
int 聲明整型變量或函數
long 聲明長整型變量或函數
float 聲明浮點型變量或函數
double 聲明雙精度變量或函數
char 聲明字符型變量或函數
struct 聲明結構體變量或函數
union 聲明共用數據類型
enum 聲明枚舉類型
typedef 用以給數據類型取別名
const 聲明隻讀變量
unsigned 聲明無符號類型變量或函數
signed 聲明有符號類型變量或函數
extern 聲明變量是在其他文件正聲明
register 聲明寄存器變量
static 聲明靜態變量
volatile 說明變量在程序執行中可被隱含地改變
void 聲明函數無返回值或無參數,聲明無類型指針
if 條件語句
else 條件語句否定分支(與 if 連用)
switch 用於開關語句
case 開關語句分支
for 一種循環語句
do 循環語句的循環體
while 循環語句的循環條件
goto 無條件跳轉語句
continue 結束當前循環,開始下一輪循環
break 跳出當前循環
default 開關語句中的“其他”分支
sizeof 計算數據類型長度
return 子程序返回語句(可以帶參數,也可不帶參數)循環條件

補充內容

第一個C程序

#include<stdio.h>
#include<windows.h>//windows.h系統頭文件,僅僅是為瞭停屏
int main()
{
	printf("hello world!\n");
	system("pause");//pause停屏
	return 0;
}

文件代碼在進行生成解決方案後會轉換成可執行程序(二進制文件 .exe)

可以通過清空解決方案來清空可執行程序

  • 在windows中,雙擊的本質運行程序,將程序加載到內存中。
  • 任何程序在被被運行之前都必須被加載到內存當中。
  • 加載到內存中,速度快。

馮諾依曼

定義與聲明

變量

在內存中開辟特定大小的空間,用來保存數據

變量的定義

類型  變量名 = 默認值
int a = 10;
char c = 'c';

定義變量的原因:因為有數據需要暫時被保存起來,等待後續處理。

變量的本質

  • 所有的變量的本質都是要在內存的某個位置開辟空間的。
  • 程序運行,需要加載到內存中
  • 程序計算,需要使用變量

定義變量的本質:在內存中開辟一塊空間,用來保存數據。(為何一定是內存:因為定義變量,也是程序邏輯的一部分,程序已經被加載到內存)

定義:開辟空間,隻能有一次。

聲明:告知,可以多次。

int a = 10;//a的定義
a = 20;//賦值
a = 100;//賦值

變量的分類

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

局部變量:包含在代碼塊中的變量叫做局部變量。局部變量具有臨時性。進入代碼塊,自動形成局部變量,退出代碼塊自動釋放。[網上很多說函數中的變量是局部變量,不能說錯,但說法是不準確的](定義在代碼塊內)

全局變量:在所有函數外定義的變量,叫做全局變量。全局變量具有全局性。(定義在代碼塊外)
代碼塊:用{}括起來的區域,就叫做代碼塊

#include<stdio.h>
int g_val = 100;//全局變量
int main()
{
	int a = 10;//局部變量,main函數也是函數,也有代碼塊{}
	if(a == 10)
	{
		int b = 10;//局部變量
    }
	printf("a=%d\n", a);
	return 0;
}

變量的作用域

作用域:指的是該變量的可以被正常訪問的代碼區域。
局部變量:隻在本代碼塊內有效。
全局變量:整個程序運行期間,都有效。

其中全局變量:

  • 在任何代碼塊中都可以被訪問
  • 在任何代碼塊中都可以被訪問,甚至被修改。
  • 當全局變量與局部變量同名時,局部變量優先。
#include<stdio.h>
int g_vax = 10;//全局變量
void test()
{
	int g_val = 100;//局部變量的g_val隻能在本代碼被訪問
	printf("%d\n", g_val);//在全局變量g_val任何代碼塊中都可以被訪問,甚至被修改
	//輸出的是局部,也就是局部和全部同名的時候,優先局部。
}
int main()
{
	test();
	printf("%d\n", g_vax);//在任何代碼塊中都可以被訪問
	return 0;
}

變量的生命周期

生命周期概念:指的是該變量從定義到被釋放的時間范圍,所謂的釋放,指的是曾經開辟的空間”被釋放“。
局部變量: 進入代碼塊,形成局部變量[開辟空間],退出代碼塊,"釋放"局部變量。
全局變量: 定義完成之後,程序運行的整個生命周期內,該變量一直都有效。

作用域 vs 生命周期

作用域:衡量變量影響的范圍,該變量的有效作用域。
生命周期:描述的是變量生存時間的長短。時間的概念:什麼時候被開辟,什麼時候被釋放。

最寬宏大量的關鍵字 – auto

如何使用:一般在代碼塊中定義的變量,即局部變量,默認都是auto修飾的,不過一般省略。
默認的所有變量都是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已經很老,基本上不使用瞭。

最快的關鍵字 – register

CPU主要是負責進行計算的硬件單元,但是為瞭方便運算,一般第一步需要先把數據從內存讀取到CPU內,那麼也就需要CPU具有一定的數據臨時存儲能力。註意:CPU並不是當前要計算瞭,才把特定數據讀到CPU裡面,那樣太慢瞭。
所以現代CPU內,都集成瞭一組叫做寄存器的硬件,用來做臨時數據的保存。

存儲金字塔

距離CPU越近的存儲硬件,速度越快。

寄存器的認識

CPU內集成瞭一組存儲硬件即可,這組硬件叫做寄存器。

寄存器存在的本質

在硬件層面上,提高計算機的運算效率。因為不需要從內存裡讀取數據啦。

register 修飾變量

盡量將所修飾變量,放入CPU寄存區中,從而達到提高效率的目的
那麼什麼樣的變量,可以采用register呢?
1.局部的(全局會導致CPU寄存器被長時間占用)
2.不會被寫入的(寫入就需要寫回內存,後續還要讀取檢測的話,就無意義瞭)
3.高頻被讀取的(提高效率所在)
4.如果要使用,請不要大量使用,因為寄存器數量有限
5.register修飾的變量,不能取地址(因為已經放在寄存區中瞭嘛,地址是內存相關的概念)

寄存器–cache–內存–SSD/flash/硬盤–光盤–磁盤

硬盤通過緩存技術成內存,內存通過緩存技術成寄存器。

距離CPU越近的儲存單元,效率越高,單價成本越高。

距離CPU越遠的儲存單元,效率越低,單價成本越便宜。

對任何一種硬件而言,充當上遊硬件的緩存。

例:內存可以看成硬盤的一個大緩存;cache和寄存器相當於內存某一種緩存。

CPU訪問數據的時,以最小的成本達到最高的效率。

#include<stdio.h>
int main()
{
	register int a = 10;
	printf("%p\n", &a);
	return 0;
}

寫在最後

到此這篇關於C語言深度解剖篇之關鍵字以及補充內容的文章就介紹到這瞭,更多相關C語言關鍵字及補充內容內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: