2012-04-28 61 views
1

在瀏覽我的朋友的代碼,我就注意到這一點:開關頭中的變量聲明?

switch(State &state = getState()) { 
case Begin: state = Search; break; 
// other stuff similar 
} 

什麼是在開關頭部的變量?他正在使用GCC,所以我認爲這可能是GCC擴展。任何想法?

+0

代碼塊開始與開放大括號,所以它不應該是一個問題。 – 2012-04-28 17:37:03

+2

這是你的一個詭計問題嗎?我感覺到這個Q有一個被接受的答案時,我們的方式激烈地來到我們的方式: - ] – 2012-04-28 17:37:35

+2

哦,我沒有意識到它是約翰內斯...我覺得被騙回答。 – 2012-04-28 17:38:04

回答

9

這不是祕密或GCC擴展。變量允許在諸如if s,while s和switch es的條件下聲明。例如:

while (char c = cin.get()) { ... } 

if (int* something = (int*)malloc(4)) { // but don't use malloc in C++ 
    // ... 
} 

後它們被聲明的初始化,它們被轉換爲一個bool值,並且如果他們評估爲true執行塊,並且該塊被否則跳過。它們的範圍是其聲明條件的構造的範圍(並且在if的情況下,範圍也覆蓋了所有的else ifelse塊)。

在C++ 03標準的§6.4.1,它說

選擇語句選擇若干控制流之一。

selection-statement: 

    if (condition) statement 
    if (condition) statement else statement 
    switch (condition) statement 

condition: 

    expression 
    type-specifier-seq declarator = assignment-expression 

所以你可以看到,它允許type-specifier-seq declarator = assignment-expressionifswitch的條件。而且你會在「重複構造」部分找到類似的東西。

此外,switch ES上一體或enum類型或類實例可以隱式轉換爲一個整體或enum類型(§6.4.4)工作:

的條件的值,該值是 中的初始化聲明switch語句是聲明變量的值,如果它具有 積分或枚舉類型,或者該變量隱式轉換爲 否則爲整數或枚舉類型。

我其實知道了FROM AN ANSWER YOU POSTED關於「隱藏的C++特性」的問題。所以我很高興我可以提醒你:)

+0

是的,但它在'switch()'上,這意味着它只接受'int'值? – Muggen 2012-04-28 17:38:30

+0

@Muggen在例子'State'中可能是'enum'。 – 2012-04-28 17:39:06

+0

是這個C++ 11嗎? hmm – 2012-04-28 17:39:16