int i = 10;
switch( i )
{
case 1:
// do sth1
break;
case 2:
// do sth2
break;
case 3:
// do sth3
break;
default:
// do sth default
break;
}
问题1>当switch语句执行时,我们是直接跳转到正确的case语句还是从上到下进行搜索?
答:直接跳转到正确的案例陈述。
问题2>我们应该在默认语句后使用break语句吗?
答:取决于。 如果default语句是最后一个case语句,则不需要使用break。
我是否在上述问题中得到了答案?
default语句应该始终是最后一种情况。
永远小心。 我有一个案例,我在duff的设备类型构造中首先创建它。
我想补充一点,虽然使用fall through是一种有效且有效的技术,但是其他可能会与你一起处理代码的人可能会把它看成是一个"bug",并且想要一个break语句。忘记放一个 闯入是一个相当常见的错误,所以这是可以理解的。 为了避免这种情况,有必要发表评论说这是故意的。
@Clairvoire:每当我故意失败时,我通常会添加//nobrake评论。
问题1:取决于编译器。 C ++标准不要求设置跳转表。
在许多情况下,特别是对于少量稀疏情况,GCC,MSVC和其他编译器将进行逐条款检查(就好像它是if语句)。举个例子,假设您的案例是1,15和1000000.进行直接跳转在代码方面效率不高。
gcc有选项-fno-jump-tables来强制它构建等效的if-else列表。
问题2:最后一个子句不需要break语句。如果执行应该向下流动,则应该省略它。
对于答案二你是正确的,除非我要在默认语句之后添加一个中断,如果它是最后一个案例或它不是,你不希望它通过。但这只是一个挑剔。
问题1的答案取决于是否启用了优化以及编译器的智能程度。如果优化很低或禁用(或者您的编译器只是旧的和/或不是非常复杂),它将从上到下跳过默认情况(谢谢q0987)。如果启用了优化并且编译器决定执行此操作,它将被优化为跳转表,在这种情况下,它将直接跳转到正确的大小写。
如果禁用优化并假设你所说的是正确的,那么如果我将默认语句放在所有情况之前,代码将无效。 如果我没记错的话,C ++不需要将默认值放在特定位置。
@ q0987哦好点。 我会修改我的答案。
"如果这是最后一个案例,你不希望它落空。但这只是一个挑剔。"......落到哪里? 这是最后一个案例!
@Karl对不起,措辞不好
Question 1> When the switch statement executes, do we jump directly to the right
case statement or do we search from top to bottom?
我不认为标准中有关此实现细节的任何提及。但是,你的答案是正确的。
Question 2> Should we use a break statement after the default statement?
是的,这取决于要求。有时您可能根本不需要它。考虑一下这种情况,你想要为default:案例做些什么,而对于case 1:来说则要做点小事。例如,
switch(i)
{
default: foo();
case 1: bar();
break;
case 2: abc();
break;
case 3: xyz();
break;
}