如何在switch case中定義變量(不用花括號)

這個週末有幸見到了幾位神交已久的庫友(每天/迪迪/丁丁),你們一塊兒扯了些有的沒的,很開森!express

每天考了我一個問題,在C語言裏面,如何在switch case中定義一個變量?要求是不用花括號ide

這個問題是背景是,下面的代碼是編譯不過的,由於在case後面不能直接定義變量。學習

switch (v) {
   case 1:
      int a;
      get_value_of_xx(&a);
      set_yy(a);
      break;
   case 2:
      //do_sth
      break;
   defalut:
      break;
}

每天問我用什麼特殊的招式能夠化解這個編譯錯誤?(加花括號不算)spa

答案居然是把code

case 1:

改爲ip

case 1:;

加一個分號,是否是以爲頗有趣?是否是百思不得其姐?(反正我是)
get

每天給我講了一個我之前從未意識到的問題,case 和 defalt 其實都是標籤,這麼一說我一會兒就明白了達夫設備的工做原理(雖然老早就知道達夫設備,但沒有悟透)編譯器

維基百科上有對達夫設備的介紹 http://zh.wikipedia.org/wiki/%E8%BE%BE%E5%A4%AB%E8%AE%BE%E5%A4%87it

send(to, from, count)
register short *to, *from;
register count;
{
	register n = (count + 7) / 8;
	switch(count % 8) {
	case 0:	do {	*to = *from++;
	case 7:		*to = *from++;
	case 6:		*to = *from++;
	case 5:		*to = *from++;
	case 4:		*to = *from++;
	case 3:		*to = *from++;
	case 2:		*to = *from++;
	case 1:		*to = *from++;
		} while(--n > 0);
	}
}


我把C99標準拿出來學習了一下,標籤的巴科斯範式:io

(6.8.1) labeled-statement:

      identifier : statement

      case constant-expression : statement

      default : statemen

如每天所說,case和default都是標籤。

那麼 statement 的巴科斯範式是怎麼樣的呢?

(6.8) statement:

     labeled-statement

     compound-statement

     expression-statement

     selection-statement

     iteration-statement

     jump-statement

標籤後面幾乎什麼均可以,但惟獨不能夠是 declaration expression  (定義變量的表達式)

也就是說,能夠這樣

case 1:
{
  int a;
}

但不能夠這樣 

case 1:
  int a;

由於上面的寫法不符合標籤的巴科斯範式,編譯器在作語法分析的時候報錯

可是一旦寫成

case 1:;
   int a;

編譯就經過了,由於分號做爲空語句,徹底符合標籤的巴科斯範式


這篇文章話只說了1/3,至於爲何標籤後面(緊接其後)不能定義變量? C++又是怎麼樣的? 請讀者自行思考和試驗,我只負責拋磚。

今天冬至,太困了,不寫了。

相關文章
相關標籤/搜索