簡體   English   中英

當`default:`標簽放在大括號外時,復合開關語句中的局部變量是否被初始化?

[英]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語句是一個類似forwhile的語句,因此沒有反對不使用復合語句的規則,請查看此處的示例 但這意味着,可以在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM