[英]Are local variables in a compound switch statement initialized when the `default:` label is put outside the braces?
通常在使用switch
語句時,您無法定義和初始化復合語句的局部變量,例如
switch (a)
{
int b = 5; /* Initialization is skipped, no matter what a is */
case 1:
/* Do something */
break;
default:
/* Do something */
break;
}
但是,由於switch
語句是一個類似for
或while
的語句,因此沒有反對不使用復合語句的規則,請查看此處的示例 。 但這意味着,可以在switch
關鍵字和左括號之后的右括號之間使用標簽。
所以在我看來,有可能並且允許使用這樣的switch
語句:
switch (a)
default:
{
int b = 5; /* Is the initialization skipped when a != 1? */
/* Do something for the default case using 'b' */
break;
case 1: // if a == 1, then the initialization of b is skipped.
/* Do something */
break;
}
我的問題:在這種情況下是否必須執行初始化(a!= 1)? 根據我所知的標准,是的,它應該是,但我無法直接在我提供的任何文件中找到它。 任何人都可以提供確定的答案嗎?
在我得到這方面的評論之前,是的,我知道這不是在現實世界中編程的方法。 但是,和往常一樣,我對語言規范的界限感興趣。 我從來沒有在我的編程團隊容忍這樣的風格!
大多數人認為的switch
為多發,如果,但它在技術上是一個計算的goto
。 case <cte>:
和default:
實際上是標簽。 所以goto
的規則適用於這些情況。
您的兩個示例在語法上都是合法的,但在第二個示例中,當a==1
,將跳過b
初始化並且其值將是未定義的。 沒有問題,只要你不使用它。
參考 :
根據C99標准6.2.4.5,關於自動變量:
如果為對象指定了初始化,則每次在執行塊時達到聲明時都會執行初始化;
因此,每次執行流程到達初始化時,變量都會被初始化,就像它是一個賦值一樣。 如果你第一次跳過初始化,那么變量將保持未初始化狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.