1

在浏览我朋友的代码时,我注意到了这一点:

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

开关头中的变量是什么?他正在使用 GCC,所以我认为这可能是 GCC 扩展。任何想法?

4

1 回答 1

9

这不是秘密或 GCC 扩展。if允许在s、whiles 和switches之类的条件下声明变量。例如:

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

或者

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

在它们被声明为初始化后,它们被转换为一个bool值,如果它们评估为true块,则执行该块,否则跳过该块。它们的范围是在其条件中声明它们的构造的范围(在 的情况下if,范围也在所有else ifandelse块上)。

在 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-expressionifor的条件下switch。你会在“重复结构”部分找到类似的东西。

此外,switches 适用于可以隐式转换为整数或类型的类的整数或enum类型enum实例(第 6.4.4 节):

在 switch 语句中作为初始化声明的条件的值是声明变量的值,如果它具有整数或枚举类型,或者是该变量隐式转换为整数或枚举类型的值。

实际上,我是从您在“C++ 的隐藏功能”问题上发布的答案中了解到的。所以我很高兴我能提醒你:)

于 2012-04-28T17:36:31.820 回答