您好,匿名用户
随意问技术百科期待您的加入

Switch语句比起if else语句有哪些优势?

0 投票

刚学完c++,觉得switch语句除了条理清晰些,没有别的太大优势,小弟不才,还望指教。

用户头像 提问 2012年 12月1日 @ Brand 上等兵 (185 威望)
分享到:

1个回答

0 投票
 
最佳答案

在大多数情况下,switch的性能不会比if else低。
在某些特定情况下,编译器能对switch进行优化。比如说:
1. 不按顺序比较,而是构造一个二分查找树(binary decision tree), 这样子比较的平均次数就会下降。
2. 可以做个跳转表(jump table)这样子就不许要任何比较了。比如如下的代码。

int main(int argc, char* argv[])
{
	int j = 0;
	int n;
	cin>>n;
	switch(n)
	{
	case 1: j = 1; break;
	case 2:	j = 2; break;
	case 3:	j = 3; break;
	case 4:	j = 5; break;
	default:j = 6;
	}
	cout<<j<<endl;
	return 0
}

其在VS2008编译器下产生的代码如下

switch(n)
00401011  mov         eax,dword ptr [esp] 
00401014  dec         eax  
00401015  cmp         eax,3 **<==这里只比较了一次,看看是否是default分支**
00401018  ja          0040103D 
0040101A  jmp         dword ptr [eax*4+00401064h] **<==这里直接用了一个跳转表,没有比较语句**
	{
	case 1: j = 1; break;
00401021  mov         eax,1 
00401026  jmp         00401042 
	case 2:	j = 2; break;
00401028  mov         eax,2 
0040102D  jmp         00401042 
	case 3:	j = 3; break;
0040102F  mov         eax,3 
00401034  jmp         00401042 
	case 4:	j = 5; break;
00401036  mov         eax,5 
0040103B  jmp         00401042 
	default:j = 6;
0040103D  mov         eax,6 
	}
	cout<<j<<endl;
00401042  mov         ecx,dword ptr ds:[0040203Ch] 
00401048  push        ecx  
00401049  mov         ecx,dword ptr ds:[0040204Ch] 
0040104F  push        eax  
00401050  call        dword ptr ds:[00402038h] 
00401056  mov         ecx,eax 
00401058  call        dword ptr ds:[00402040h] 
	return 0;
用户头像 回复 2012年 12月1日 @ Nidalee 上等兵 (346 威望)
选中 2012年 12月1日 @Brand
提一个问题:

相关问题

0 投票
1 回复 41 阅读
0 投票
1 回复 49 阅读
0 投票
0 回复 22 阅读
+1 投票
1 回复 34 阅读
0 投票
0 回复 182 阅读
用户头像 提问 2012年 12月1日 @ Sion 上等兵 (319 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...