在浏览我的朋友的代码,我就注意到这一点:开关头中的变量声明?
switch(State &state = getState()) {
case Begin: state = Search; break;
// other stuff similar
}
什么是在开关头部的变量?他正在使用GCC,所以我认为这可能是GCC扩展。任何想法?
在浏览我的朋友的代码,我就注意到这一点:开关头中的变量声明?
switch(State &state = getState()) {
case Begin: state = Search; break;
// other stuff similar
}
什么是在开关头部的变量?他正在使用GCC,所以我认为这可能是GCC扩展。任何想法?
这不是秘密或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 if
和else
块)。
在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-expression
在if
或switch
的条件。而且你会在“重复构造”部分找到类似的东西。
此外,switch
ES上一体或enum
类型或类实例可以隐式转换为一个整体或enum
类型(§6.4.4)工作:
的条件的值,该值是 中的初始化声明switch语句是声明变量的值,如果它具有 积分或枚举类型,或者该变量隐式转换为 否则为整数或枚举类型。
我其实知道了FROM AN ANSWER YOU POSTED关于“隐藏的C++特性”的问题。所以我很高兴我可以提醒你:)
是的,但它在'switch()'上,这意味着它只接受'int'值? – Muggen 2012-04-28 17:38:30
@Muggen在例子'State'中可能是'enum'。 – 2012-04-28 17:39:06
是这个C++ 11吗? hmm – 2012-04-28 17:39:16
代码块开始与开放大括号,所以它不应该是一个问题。 – 2012-04-28 17:37:03
这是你的一个诡计问题吗?我感觉到这个Q有一个被接受的答案时,我们的方式激烈地来到我们的方式: - ] – 2012-04-28 17:37:35
哦,我没有意识到它是约翰内斯...我觉得被骗回答。 – 2012-04-28 17:38:04