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。
我是否在上述问题中得到了正确答案?
答案 0 :(得分:4)
问题1:取决于编译器。 C ++标准不要求设置跳转表。
在许多情况下,特别是在稀疏案例数量较少的情况下,GCC,MSVC和其他编译器将进行逐条款检查(就像它是if语句一样)。举个例子,假设您的案例是1,15和1000000.直接跳转在代码方面效率不高。
gcc有选项-fno-jump-tables
来强制它构建等效的if-else列表。
问题2:最后一个子句不需要break语句。如果执行应该向下流动,则应该省略它。
答案 1 :(得分:1)
对于答案二你是正确的,除非我在默认语句之后添加一个中断,如果它是最后一个案例或它不是,你不希望它失败。但这只是一个挑剔。
问题1的答案取决于是否启用了优化以及编译器的智能程度。如果优化很低或禁用(或者您的编译器只是旧的和/或不是非常复杂),它将从上到下跳过默认情况(谢谢q0987)。如果启用了优化并且编译器决定执行此操作,它将被优化为跳转表,在这种情况下,它将直接跳转到正确的大小写。
答案 2 :(得分:0)
问题1> 当switch语句执行时,我们是否直接跳到右侧 案例陈述或我们从上到下进行搜索?
我认为标准中没有提及此实施细节。但是,你的答案是正确的。
问题2> 我们应该在默认声明后使用break语句吗?
是的,这取决于要求。有时您可能根本不需要它。考虑一下这种情况,你想为default:
案例做些什么,而对于case 1:
来说,则要做点小事。例如,
switch(i)
{
default: foo();
case 1: bar();
break;
case 2: abc();
break;
case 3: xyz();
break;
}