C語言關鍵字之auto register詳解

一:auto

在學習關鍵字auto之前我們需要先瞭解兩個概念:作用域和生命周期。

作用域

作用域(scope)是程序設計概念,通常來說,一段程序代碼中所用到的名字並不總是有效/可用

的 而限定這個名字的可用性的代碼范圍就是這個名字的作用域。

局部變量的作用域:作用范圍包含在代碼塊中的變量。在哪兒內定義,隻在其范圍內有效。

全局變量的作用域:在所有函數外定義的變量。整個項目中都有效。

我們用簡單代碼來理解一下:

int a = 20;
int main()
{
	if (1)
	{
		int b = 10;
		printf("%d", b);
	}
	return 0;
}

這段代碼中我們可以看到我們創建瞭兩個變量,一個是全局變量 a ;一個是局部變量 b 。

根據作用域的定義我們可以知道:

全局變量a的作用域是整個工程:

 局部變量b 的作用域隻是包含在if括號內部:

 為瞭我們更好的理解這個代碼我們寫幾種代碼,加深理解:

int a = 20;
int main()
{
	if (1)
	{
		int b = 10;
	}
	printf("%d", a);
	printf("%d", b);
	return 0;
}

這段代碼我們發現報錯

 雖然我們b創建瞭,但是b是一個局部變量,作用域隻在代碼塊內部( if 括號內部 ),不包括printf這一行,因此程序報錯,訪問不到b。

特殊的:

當局部變量和全局變量發生沖突時,局部變量優先。

這句話的意思是:當定義的變量名相同時,局部變量優先

int a = 20;
int main()
{
	a = 10;
	printf("%d", a);
	return 0;
}

我們打印就可發現:

 當全局變量和局部變量發生沖突時,局部變量優先。為瞭避免這種問題的出現,盡量不要使用相同的變量名定義。

生命周期

變量的生命周期指的是變量的創建到變量的銷毀之間的一個時間段

局部變量的生命周期是:進入局部變量所在范圍開始 —-> 出瞭局部變量的范圍結束

全局變量的生命周期是:整個程序的生命周期。生命周期main函數進入—>結束 整個程序的生命周期

為瞭更方便的理解:我們可以通俗的理解為,一個變量的存活時間,就是這個變量的生命周期。

例:古代某一皇帝從出生–>駕崩。從出生到駕崩這一段時間就是這位皇帝的生命周期。

// ***************生命周期***********
//int  g = 100;//全局變量的生命周期:
//			   //生命周期main函數進入--->結束 整個程序的生命周期
//int main(){
//	{  // 局部變量生命周期:
//	   //進入局部變量所在范圍開始 ----> 出瞭局部變量的范圍結束
//		int a = 100;
//		printf("%d\n", a);
//	}
//
//
//	return 0;
//}

auto

auto號稱是最寬宏大量的關鍵字

auto的使用:一般在代碼塊中定義的變量,局部變量,默認都是auto修飾的。隻在本代碼塊中使用 auto可省略。

用代碼解釋就是:

auto int g_val = 100;
int main()
{
	for (auto int i = 0; i < 10; i++)
	{
		printf("i = %d\n", i);
		if (1)
		{
			auto int j = 1;
			printf("before: %d\n", j);
			j++;
			printf("after: %d\n", j);
		}
	}
	return 0;
}

由於auto隻可修飾局部變量

因此第一句auto int g_val = 100;是錯誤的

在之後的代碼內部的全局變量中,auto所修飾的局部變量中的auto都是可以省略的,因此我們也說auto是最古老的關鍵字,我們在平時的編程中也可省略auto。

二:register

register — 寄存器   —-最快的關鍵字

我們首先要瞭解存儲等級

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

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

對於任意一種硬件而言,上遊硬件都是下遊硬件的緩存,因此我們可以說寄存器是下遊存儲設備的緩存。

寄存器的本質:本質是在硬件層面上,提高計算機的運算效率。

什麼變量可以用register

1.局部變量(全局變量導致CPU寄存器被長時間占用)

2.不會被寫入(寫入就要寫回內存,要重新加載,無意義)

3.被高頻使用(提高效率所在,放在寄存器,不用訪存讀取,提高效率)

int main()
{
	register int val = 100;
	//寄存器變量沒有地址,不能取地址
	val = 200; //可以被寫入
	printf("%d\n", val);
	// 在gcc編譯器下 也不允許取地址
	return 0;
}

提示:不要大量使用register,因為寄存器的數量有限。

由於使用register關鍵字,直接將val存在寄存器內,因此val沒有內存地址,因此不能進行取地址操作。

總結:

包括作用域,生命周期,auto和register關鍵字的理解是使用。

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: