首頁 > 軟體

C語言全面細緻精講關鍵字的使用

2022-05-25 14:03:02

1、switch 深入理解

學習過C語言的小夥伴可能知道,switch 也是選擇結構的一種,是具有判定能力的語法結構,那麼他們都必須具備:判定+分支功能!

我們知道 if 可以搭配 else if 或 else 來實現分支功能,那麼我們 switch 如何實現分支功能呢?這樣,我們先來看一段程式碼:

可能看到這有小夥伴會有疑問,這裡為什麼把後面case 裡面的語句也列印出來了呢???

其實:case 只是提供入口而已,case 並不能實現分支功能,它本身是用來進行判定的!像上面那段程式碼,從case 2 進入只要沒有碰到 break 程式就會一直向下執行,直到結束 switch !

所以我們要注意,要在每條 case 完成後按需加上 break,所以 break 在 switch 裡的作用就相當於分支功能!

推薦寫法:

其實細心的小夥伴發現了,萬一我們輸入的不是1~5呢?

這裡我們就要用到 default 了,在往後寫程式碼,我都建議使用switch 時都帶上 default ,並且將 default 寫在最後一個 case 後面,雖然 default 從語法上寫在任何位置都是支援的,但是為了我們的程式碼可讀性,能更直觀,建議寫在最後!

例:

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期一n");
		break;
	case 2:
		printf("星期二n");
		break;
	case 3:
		printf("星期三n");
		break;
	case 4:
		printf("星期四n");
		break;
	case 5:
		printf("星期五n");
		break;
	default :
		printf("輸入錯誤n");
        break;
	}
	return 0;
}

如果多個不同的 case 匹配,想執行同一個語句怎麼辦呢?比如說我希望輸入1~5都是工作日,輸入6~7是休息日,推薦寫法:

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日n");
		break;
	case 6:
	case 7:
		printf("休息日n");
		break;
	default:
		printf("輸入錯誤n");
		break;
	}
	return 0;
}

2、如何正確的使用 case

現在我們就來學習下使用 case 的細節:

case後面只能是常數整型,或者常數表示式,不能是浮點型,可以是字元型,因為字元本質上儲存在記憶體中是它們的ASCII碼,所以是屬於整型家族的!

那麼 const 修飾的變數可以放在case後面嗎?

答案是不可以的!為什麼不可以呢?因為 const 修飾的變數是常變數,它擁有常數的屬性,但本質上還是一個變數!

下面有幾點 case 使用建議給大家:

  • 按字母或數位順序排列各條 case 語句
  • 把正常情況放在前面,而把異常情況放在後面(做好註釋)
  • 簡化每種情況對應的操作,case語句後面的程式碼儘量不要超過20行
  • 不要為了使用 case 語句而刻意製造一個變數
  • default 子句只用於檢查真正的預設情況

3、迴圈語句while for do while深度講解

相信大家學過C語言的對 while for do while 迴圈的基本語法肯定是瞭如指掌了,所以今天我就不帶著大家學習基本語法了,我們直接看流程圖:

我們要注意所有迴圈結構的三要素:條件初始化,條件判定,條件更新。

三種迴圈死迴圈寫法(特殊情況不具備三要素):

我們來看幾個使用迴圈語句的注意點:

  • 建議寫 for 語句的時候迴圈控制變數採用半開半閉取值範圍:比如:for (i = 0; i < 10; ++i),for(i = 0; i <=9; ++i); 我們更推薦第一種寫法,因為迴圈次數明確,便於個數計算。
  • 儘量不要在迴圈體內修改迴圈控制變數,防止迴圈失去控制!
  • 迴圈語句的表示式不能包含任何浮點型別物件,通過上期我們知道,浮點數在儲存時是會造成精度損失的!

4、continue的作用是什麼

我們知道 continue 是用於終止本次迴圈的,也就是本次迴圈中 continue 後邊的程式碼不會再執行!

我們分別來演示下三種迴圈下 continue 不同的地方:

while:

while 迴圈執行 continue 是直接跳轉到 while 語句的判斷部分,進行下一次迴圈的入口判斷。

do while:

do while 迴圈執行 continue 是直接跳轉到 do while 語句下面的判斷部分,進行下一次迴圈的入口判斷。

for:

for 迴圈執行 continue 是直接跳轉到 for 語句的條件更新部分,然後再進行下一次迴圈的入口判斷。

相信看到這小夥伴們對 continue 的理解更加深刻了,那麼接著往後看吧!

5、goto真的沒人用了嗎

可能跟著學校在學習的小夥伴,都沒聽老師講過 goto 語句,那麼今天我們就來了解下為什麼很少人會用 goto 語句?

goto 語句是c語言給我們提供一個基本的語法結構,給我們提供了程式碼跳轉的一個能力,對於我們一般的程式設計師來講,因為太靈活可能會導致我們語句在執行的時候它的分支可能會不明確,所以在很多的公司內它的編碼規範當中是禁止使用 goto 語句的,但是如果我們把 goto 語句用好了是會出奇效的今天不講奇效,重點講作用:

goto語句通常會用兩種用法:向下跳轉,向上跳轉:

那麼我們應該如何看待 goto 呢?

1、有很多公司確實禁止使用 goto,不過,這個問題我們還是靈活對待,goto 在解決很多問題是有奇效的。

2、我們可以認為 goto 使用場景較少,一般不使用。但是必須得知道 goto,需要的時候,也必須會用。

我們來看個例子吧,在 Linux 核心原始碼中充滿了大量的goto:

所以說,goto 還是有人用的!

6、void 到底是何方妖怪

我們知道C語言提供了很多種資料型別,int,float,char... 大家都知道 void 是空型別,那麼首先我們來思考第一個問題,void 可以定義變數嗎?

答案顯然是不可以的! void 的型別大小是不確定的!

經過測試,void 在 windows環境的 vs 編譯器下 sizeof 求出的大小是 0 ,而在 linux 環境的 gcc 編譯器 sizeof 求出的大小卻是 1 !

既然在 gcc 編譯器求出的大小是1,為什麼還是不能定義變數?其實最主要的原因是 void 本身就被編譯器解釋為空型別,強制的不允許定義變數,在語意的級別上就被約束了!

而 void 作為空型別,理論上是不應該開闢空間的,即使開闢了空間,也僅僅作為一個預留位置看待!

我們來看 void 的幾個場景:

① void 修飾函數但是有了返回值:

由上可見,void 修飾的函數是不能接收返回值的,但是經過測試,如果不拿變數接收返回值一樣可以編譯過去,但是不要這樣寫,首先 void 充當預留位置,讓我們知道此函數不需要返回值,再者,可以告知編譯器,這個返回值無法接收!

② void 充當函數形參列表:

同時我們也能看出來,void 充當函數形參列表,我們在 vs 環境下如果強求給函數傳參是會有警告的,但是編譯仍然能通過,但是如果我們在 Linux 環境下是會直接報錯的!這個取決於編譯器!

③ void 既然不能定義變數,那麼 void* 呢?

首先告訴小夥伴們答案,顯然是可以的!

為什麼呢,因為 void* 是指標,指標的大小在任何平臺都是固定的,如果在 32 位的作業系統下指標的大小是 4 個位元組,如果在 64 位元運算系統下指標的大小是 8 個位元組(在指標章節我們會詳細講解),不信我們就用 sizeof 求一下指標所佔的大小:

④ void* 可以被任何型別的直接接收,同時 void* 可以接收任意指標型別(常用):

通常我們 void* 會用在庫,系統接的設計上:比如在C中 memset、memcmp 函數等...

⑤ void* 定義的指標變數可以進行運算操作嗎?

原因:因為一般對指標進行 + 或 - 更多的是衡量一個指標向前或者向後移動步長的問題,而整型指標基本都會指向一個整型變數,所以對它進行 ++ 後一定是跳過一個整型變數指向下一個整型變數,也就是說向後移動 sizeof(int);的大小,而 void* 指標的大小本來就是不明確的!

但是在 Linux 環境下是可以編譯通過的,因為 Linux 求 sizeof(void);是佔 1 個位元組的,所以對 void* 指標進行 ++ -- 是向前或向後移動一個位元組,但是在 windows vs 環境下佔 0 位元組,無意義的!

根本原因是因為使用的C標準擴充套件的問題,一句話,大部分編譯器是標準C,而Linux下是擴充套件C,Linux平臺也能保證標準C的執行,感興趣的小夥伴可以自己去查詢下資料~

最後一點,void* 指標是不能直接解除參照的!因為並不知道以什麼型別去解釋指向空間裡的資料,也就是說並不知道解除參照存取多少個自己,會直接編譯報錯,在 Linux 環境下也是一樣的,具體小夥伴的可以自行去測試哦!

只有埋頭,才有出頭!Come on!

到此這篇關於C語言全面細緻精講關鍵字的使用的文章就介紹到這了,更多相關C語言關鍵字內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com