没有 case: 或 default: 标签的 switch 语句
A switch statement without case: or default: labels
cppreference.com stats 即switch语句的形式为:
attr switch ( condition ) statement
statement
是 any 语句。
那么,如果我没有在 statement
中放置任何 case:
或 default:
标签会发生什么,如:
switch (1) {std::cout << 'x';}
如果我将不在任何 case:
或 default:
标签之后的语句用额外的大括号包裹起来会怎样:
switch (1) {{std::cout << 'x';}}
因为用额外的大括号包裹变量声明将使该声明合法,即使它在每个 case:
和 default:
标签之前也是如此。
是的,语法允许 语句 在 switch
语句中。所以下面的片段:
switch( /* condition */ )
{
std::cout << "hello";
}
是完全有效的,尽管没有用,因为 switch
中没有以 case
或 default
标签开头的语句将永远不会被执行。
如问题中所述,如果要声明变量,则需要在 switch
语句 中添加范围 。但是,这并不影响上述观点。以下片段:
switch( /* condition */ )
{
{
std::cout << "hello";
}
}
也不执行 cout
语句。
没有任何反应。
[stmt.switch/5]:
When the switch
statement is executed, its condition is evaluated. If one of the case constants has the same value as the condition, control is passed to the statement following the matched case label. If no case constant matches the condition, and if there is a default label, control passes to the statement labeled by the default
label. If no case matches and if there is no default
then none of the statements in the switch is executed.
您没有使用 case
标签标记您的任何语句,因此其中 none 被匹配条件的 case
标签标记,因此没有语句是已执行。
记住:标签不是语句之间的流构造:它们是注释 for 语句。在 switch
和 goto
的情况下,它们只是跳转到的地方。就是这样。
虽然 switch
/case
示例的通用模式和排版已在惯例和教科书中找到位置,但语言语法中没有任何内容表明您 有 那样写。
switch
只是一个条件 goto
和一个可选的回退(“默认”)案例。
cppreference.com stats 即switch语句的形式为:
attr switch ( condition ) statement
statement
是 any 语句。
那么,如果我没有在 statement
中放置任何 case:
或 default:
标签会发生什么,如:
switch (1) {std::cout << 'x';}
如果我将不在任何 case:
或 default:
标签之后的语句用额外的大括号包裹起来会怎样:
switch (1) {{std::cout << 'x';}}
因为用额外的大括号包裹变量声明将使该声明合法,即使它在每个 case:
和 default:
标签之前也是如此。
是的,语法允许 语句 在 switch
语句中。所以下面的片段:
switch( /* condition */ )
{
std::cout << "hello";
}
是完全有效的,尽管没有用,因为 switch
中没有以 case
或 default
标签开头的语句将永远不会被执行。
如问题中所述,如果要声明变量,则需要在 switch
语句 中添加范围 。但是,这并不影响上述观点。以下片段:
switch( /* condition */ )
{
{
std::cout << "hello";
}
}
也不执行 cout
语句。
没有任何反应。
[stmt.switch/5]:
When theswitch
statement is executed, its condition is evaluated. If one of the case constants has the same value as the condition, control is passed to the statement following the matched case label. If no case constant matches the condition, and if there is a default label, control passes to the statement labeled by thedefault
label. If no case matches and if there is nodefault
then none of the statements in the switch is executed.
您没有使用 case
标签标记您的任何语句,因此其中 none 被匹配条件的 case
标签标记,因此没有语句是已执行。
记住:标签不是语句之间的流构造:它们是注释 for 语句。在 switch
和 goto
的情况下,它们只是跳转到的地方。就是这样。
虽然 switch
/case
示例的通用模式和排版已在惯例和教科书中找到位置,但语言语法中没有任何内容表明您 有 那样写。
switch
只是一个条件 goto
和一个可选的回退(“默认”)案例。