C語言switch使用之詭異用法

2021-07-29 01:17:03 字數 1488 閱讀 5410

關於switch的用法這裡不再做什麼總結了,其實這個是乙個便捷的快速跳轉條件切換器。而關於這個功能最常用的技術討論點在於case後面的break以及default。這裡不討論這些,直接看下面的**:

#include"stdio.h"

int main(void)

int num = 0;

switch(num)

printf("functionrun!\n");

return 0;

上面的**中用到了乙個switch,但是**塊中沒有任何case以及default。**語法有問題嗎?編譯一下如下:

e:\workspace\02_技術實踐\01_程式語言\01_c語言\02_c和指標\switch>gcc switch.c

e:\workspace\02_技術實踐\01_程式語言\01_c語言\02_c和指標\switch>

由上面的結果可以看到,編譯沒有任何問題。那麼執行會是什麼狀態呢?會把這個唯一的printf執行輸出相應的語句?執行如下:

e:\workspace\02_技術實踐\01_程式語言\01_c語言\02_c和指標\switch>a

e:\workspace\02_技術實踐\01_程式語言\01_c語言\02_c和指標\switch>

如此看,就有點詭異了。這個printf語句是沒有執行到的!也就是說,switch語句中的**執行必須得有case標籤指示**的入口。這種行為很讓人聯想到一種情況的程式執行結果,**如下:

#include"stdio.h"

int main(void)

int num = 0;

switch(num)

int i = 123;

printf("functionrun!\n");

default:

printf("value of iis:%d\n",i);

break;

return 0;

**是在之前的**中修改的,**的第二個printf會執行,可是執行的時候i的數值是多少呢?從之前的測試可以看出,區域性變數後面的**是沒有執行過的,那麼我這個i在每次函式執行到這裡的時候會每次動態性初始化嗎?**編譯執行結果:

e:\workspace\02_技術實踐\01_程式語言\01_c語言\02_c和指標\switch>gcc switch.c

e:\workspace\02_技術實踐\01_程式語言\01_c語言\02_c和指標\switch>a

value of i is:2

e:\workspace\02_技術實踐\01_程式語言\01_c語言\02_c和指標\switch>

從上面的結果可以得出兩個結論:

1,**塊中的宣告定義是起作用的;

2,i的數值不是123證明這部分的區域性變數並沒有進行每次的動態初始化。

說起來這也是夠奇怪的乙個特點,印象中之前看《c專家程式設計》的時候似乎看到過乙個類似的描述,但是那時候c語言的水平看《c專家程式設計》一點也看不懂。只是留下了乙個模模糊糊的印象,至於是否是乙個問題,有空還是得會去查查。

初學C語言之 switch的使用

如題 五分制計分 switch語句的方便之處在於可以新增無限的分支,避免了使用分支較多時使用if語句陷入多重巢狀邏輯混亂的尷尬境地。但其不便之處在於switch 表示式 表示式的值必須為整型或字元型,且case後的常量表示式也必須是整型常量或字元型常量。那麼使用時候要格外靈活,通過變化來達到常量表示...

C語言switch語句

switch語句 switch 表示式 case 常量表示式 1 語句1 case 常量表示式 2 語句2 case 常量表示式 n 語句n default 語句 n 1 說明 1 switch後面括號內的表示式,其值可以使整形 字元型 列舉型資料 2 應該在執行乙個case 分支後,使流程跳出 s...

C語言switch語句

既然有了if else 組合為什麼還需要switch case 組合呢?那你既然有了菜刀為什麼還需要水果刀呢?你總不能扛著雲長的青龍偃月刀 又名冷豔鋸 去削蘋果吧。如果你真能做到,關二爺也會佩服你的。if else 一般表示兩個分支或是巢狀表示少量的分支,但如果分支很多的話 還是用switch ca...