switch的三個注意點
阿新 • • 發佈:2019-01-23
第一點
看別人程式碼時容易忘記這個知識點,影響理解。
switch ( pElements->Rule.ulId ) { case VID_Hello: case VID_Stops: case VID_Out: case VID_Navigation: { …… break; } case VID_Place: { …… break; } …… } // Free the pElements memory which was allocated for us ::CoTaskMemFree(pElements); }
在執行switch語句時,根據switch後面的表示式的值找到匹配的入口標號,就從此標號開始執行下去,直到遇到break;或者return;當多個分支有統一的處理邏輯時就可以統一處理。第二點
不能匹配字串
第三點
這個知識點修改幾次了,還是學到了些東西的,如下:
- 在塊作用域{}內宣告的變數,出了}就不在起作用。對於{},可能用的更多的是跟在函式名後面/程式語言本書if(){}else{}等結構。也可以這樣用:
{ int i=0; printf("%d\n",i); // 僅以此代表你要做的事,在這件事裡i是一個重要的臨時變數 } { int i=11; printf("%d\n",i); // 僅以此代表你要做的事,在這件事裡i是一個重要的臨時變數 }
- C語言是不允許在中間宣告變數的,這點不知道最新的標準是不是更新了,有點用最新標準測試,sorry,最近才想到,新標準測試環境搭好。
- 對於這段程式碼:
·C語言編譯會出現如下錯誤提示:把int i=0;提到for語句前就OK。for(int i=0;i<10;i++) { printf("%d\n",i); }
·C++是OK的。程式碼描述-1
#include <stdio.h> int main(void) { char c = 't' ; switch( c ){ case 't': printf("Case t\n"); break; case 'u': char t2 = '2'; printf("t2:%c\n",t2); break; default: printf("This is default.\n"); break; } return 0; }
編譯錯誤:測試環境 Visual Studio 2010 Win32Console
C:在u分支中加{},或者把char t2的宣告放在switch語句前就OK,C++:在u分支中加{},把char t2的宣告放在switch語句前,或者把default分支去掉就OK。這應該跟編譯器的編譯原理有關,這是什麼機制呢,或者是C/C++標準的一個什麼規則?有待解決。這樣看來,最好在每個分支中都加{}。
程式碼描述-2
編譯錯誤:#include <stdio.h> int main(void) { int a=1; switch(a) { {int b=20;} case 1: printf("b is %d\n",b); break; default: printf("b is %d\n",b); break; } return 0; }
把{int b=20;}外的大括號去掉後,編譯通過,但是有編譯警告:
輸出的b的值是未知的。這樣看來,這種情況下只是跳過了b的初始化步驟。
在CSDN論壇上發了個帖子,大家的回答還是給了我很多提示的。不得不承認自己是菜鳥的事實,這麼簡單的問題都沒想到。帖子連結