2012-04-28 118 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