2011-11-05 28 views
19
int a=10; 
switch(a) 
{ 
case 0: printf("case 0"); 
     break; 
case 1: printf("case 1"); 
     break; 
} 

上面的代码是有效的吗? 看看我是否非常确定int a不会有任何值而不是1和0,那么在这种情况下我可以避免默认值:?如果我不在开关盒中写入默认值,该怎么办?

如果无论如何一个值会不同于1和0?

编辑:我知道这是愚蠢的问题,但我想,也许这将是非法的或不确定的行为,因此只是要求,以确保

+6

我已经尝试过,但我在想,也许这将是非法或未定义的行为,所以只是要求确保 –

+0

在这种情况下,我总是把一个默认值,并抛出一个异常。现在在C#7中,我更倾向于使用“case when”来覆盖所有可能的情况,并使用default来覆盖不可能的情况。道格拉斯亚当斯会理解这个观点。 – Paulustrious

回答

47

代码有效。如果没有default:标签且case标签都不匹配“切换”值,则不会执行任何受控复合语句。执行将从switch语句的末尾继续。

ISO/IEC 9899:1999,节6.8.4.2:

[...]如果没有转换case常量表达式匹配并且不存在default标签,则不执行所述开关主体的一部分。

2

它是有效的不是有一个default情况。

但是,即使您确定您不会有任何价值而不是1和0,但最好有一个默认情况以捕获任何其他值(尽管理论上不可能,但它可能会出现在某些情况下,如缓冲区溢出)并打印出错。

+0

你假设这是一个不符合案件陈述之一的错误 - 在这种情况下可能是正确的。您可能只想执行某个变量的某些可能值的操作,并在其他情况下继续执行。恕我直言,这是一个完全合理的使用switch语句。 –

+0

@Charles:他在问题中写道:看看我是否非常确定int a没有任何价值,而不是1和0,那么在这种情况下,我可以避免默认值: –

+1

我并不是不同意你,如果遇到这种情况,很抱歉。我只是指出,虽然总的来说,有一个“默认”标签是一个好习惯,但省略一个标签并不一定是坏习惯。 –

7

这是完全合法的代码。如果a不是0或1,那么开关块将被完全跳过。

2

是上面的代码是有效的,

如果开关状态不匹配的情况下的任何条件和默认不存在程序执行继续从交换机退出而不做任何事情。

21

正如其他人指出的那样,它是完全有效的代码。但是,从编码风格的角度来看,我更愿意在评论中添加一个空的default声明,以表明我没有无意中忘记它。

int a=10; 
switch(a) 
{ 
case 0: printf("case 0"); 
     break; 
case 1: printf("case 1"); 
     break; 
default: // do nothing; 
     break; 
} 

使用/不使用default生成的代码应该是相同的。

+3

+1用于沟通意图。 – weberc2

+0

+1我用Google搜索了一个这样的答案。 – Suzi

+1

如果您打算处理枚举中的所有情况,我会建议*省略*默认情况,因为大多数编译器会警告在枚举语句中是否忘记枚举情况。 – rdb

-2

我建议每个案例必须有一个default:在这样结束就像这个代码! ,这将是很好有一个default:案例如果有什么错误发生,或更改你可以警告用户一个错误的值

int a=10; 
switch(a) 
{ 
case 0: printf("case 0"); 
     break; 
case 1: printf("case 1"); 
     break; 
default: // do nothing; 
     break; 
} 

但仍的情况下可以不default:,像运行如果声明,你可以运行if()而不是else()

+1

这是如何回答这个问题的?还有什么补充说,在接受的答案中没有说过? (另外,你应该考虑失去感叹号。) –

1

如果条件匹配并且没有提供,它与no是相同的。

默认不是开关箱中的强制。如果没有匹配的情况,并且没有提供默认值,则不执行任何操作。

2

默认不是强制性的,但总是很好。代码是理想的,但我们的生活不是,在这里提供保护并不是什么坏处。如果发生意外事件,它也会帮助你调试。

相关问题