有了 if() else if() else{} 条件语句. 为什么还要有whitch()条件语句? 用whitch()能办到的事,if()都能办到. 而且if()还更灵活通用.

worldbankc 2008-10-14 11:41:31
//有了 if() else if() else{} 条件语句. 为什么还要有whitch()条件语句? 用whitch()能办到的事,if()都能办到. 而且if()还更灵活通用.
int a=1,b=2;
switch(a){
case 1: break; // 在 case:后面我用的话是不能定义
double d; // 例如这里定义的变量就编译通不过. 使用 switch()的代码量稍微要大一些,而且也没有if()方便灵活
case 2: break; //我要问,既然有了 if()语句,为什么还要存在 switch() ,到底为什么? 它有什么比起if()的优势?

default:

}//switch(a)使用限制很多,所以我认为它既笨拙又没有,所以我编程就从来就不用. 都是用 if() 来完成所有的功能
...全文
2233 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
csgdseed 2008-10-14
  • 打赏
  • 举报
回复
容易读是一大优点
baihacker 2008-10-14
  • 打赏
  • 举报
回复
switch更直观,灵活.

case 2:
case 3:语句;
的情况下,switch更好用哟.
taodm 2008-10-14
  • 打赏
  • 举报
回复
有了汇编还要C、C++这些干什么呢,C、C++能干的汇编都能办到,而且汇编还更灵活
xhs_lh04 2008-10-14
  • 打赏
  • 举报
回复
效率高,另外多条件是代码清晰,可读性强
Dan_M 2008-10-14
  • 打赏
  • 举报
回复
Switch的优点是效率高,特别是判断条件简单,选项多时。
缺点是判断条件没有IF ELSE灵活。
allenpettle 2008-10-14
  • 打赏
  • 举报
回复
Switch的风格好一些,而且编译效率由于If else语句。
fox000002 2008-10-14
  • 打赏
  • 举报
回复
因为每种方法都有适用的范围,在使用的时候要择优
yshuise 2008-10-14
  • 打赏
  • 举报
回复
乘法能办到的事情,加法也能办到。
wangdeqie 2008-10-14
  • 打赏
  • 举报
回复
因为switch效率高点
redleaves 2008-10-14
  • 打赏
  • 举报
回复
我竟然看懂了楼上的话~
zizaifeiyu 2008-10-14
  • 打赏
  • 举报
回复
niu a jingran na huibian jieshi
fengjzh1977 2008-10-14
  • 打赏
  • 举报
回复
当存在大量比较选项时,switch 代码更直观,清晰,当然if else 更灵活。
另外向mydo学习
lyle3 2008-10-14
  • 打赏
  • 举报
回复
存在即是合理滴~~~
zmlovelx 2008-10-14
  • 打赏
  • 举报
回复
而且switch 比较简洁

摘自网上:
因为if-else语句的情况下,每一种情况都要从开始进行比较,也就是说如果某一种情况是if-else语句的最后一种可能的话,要从头比较到尾才能判断出来,而switch语句就直接到所确定的地方了,所以swwitch语句较快
switch-case是这样的,举个例子:

switch(val){
case 1:...;break;
case 2:...;break;
case 4:...;break;
case 6:...;break;
case 7:...;break;
default:...;
}

对应的汇编是
addr_tab:
dd def_addr
dd addr1
dd addr2
dd def_addr
dd addr4
dd def_addr
dd addr6
dd addr7

cmp val,7
ja def_addr
jmp dword ptr [eax*4+addr_tab]

addr1:
....
addr2:
....
addr4:
....
addr6:
....
addr7:
....
def_addr:
....
mydo 2008-10-14
  • 打赏
  • 举报
回复
PART2


cout<<"now switch turns"<<endl;
004146C6 8B F4 mov esi,esp
004146C8 A1 3C A3 41 00 mov eax,dword ptr [__imp_std::endl (41A33Ch)]
004146CD 50 push eax
004146CE 68 00 7A 41 00 push offset string "now switch turns" (417A00h)
004146D3 8B 0D 38 A3 41 00 mov ecx,dword ptr [__imp_std::cout (41A338h)]
004146D9 51 push ecx
004146DA E8 8E CA FF FF call std::operator<<<std::char_traits<char> > (41116Dh)
004146DF 83 C4 08 add esp,8
004146E2 8B C8 mov ecx,eax
004146E4 FF 15 34 A3 41 00 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A334h)]
004146EA 3B F4 cmp esi,esp
004146EC E8 D6 CA FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)

switch(i)
004146F1 8B 45 F8 mov eax,dword ptr [i]
004146F4 89 85 30 FF FF FF mov dword ptr [ebp-0D0h],eax
004146FA 83 BD 30 FF FF FF 64 cmp dword ptr [ebp-0D0h],64h
00414701 7F 1D jg wmain+1A0h (414720h)
00414703 83 BD 30 FF FF FF 64 cmp dword ptr [ebp-0D0h],64h
0041470A 74 54 je wmain+1E0h (414760h)
0041470C 83 BD 30 FF FF FF 00 cmp dword ptr [ebp-0D0h],0
00414713 74 19 je wmain+1AEh (41472Eh)
00414715 83 BD 30 FF FF FF 0A cmp dword ptr [ebp-0D0h],0Ah
0041471C 74 29 je wmain+1C7h (414747h)
0041471E EB 72 jmp wmain+212h (414792h)
00414720 81 BD 30 FF FF FF E8 03 00 00 cmp dword ptr [ebp-0D0h],3E8h
0041472A 74 4D je wmain+1F9h (414779h)
0041472C EB 64 jmp wmain+212h (414792h)
{
case 0:
puts("0");
0041472E 8B F4 mov esi,esp
00414730 68 B4 78 41 00 push offset string "0" (4178B4h)
00414735 FF 15 3C A4 41 00 call dword ptr [__imp__puts (41A43Ch)]
0041473B 83 C4 04 add esp,4
0041473E 3B F4 cmp esi,esp
00414740 E8 82 CA FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
break;
00414745 EB 62 jmp wmain+229h (4147A9h)
case 10:
puts("10");
00414747 8B F4 mov esi,esp
00414749 68 44 78 41 00 push offset string "10" (417844h)
0041474E FF 15 3C A4 41 00 call dword ptr [__imp__puts (41A43Ch)]
00414754 83 C4 04 add esp,4
00414757 3B F4 cmp esi,esp
00414759 E8 69 CA FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
break;
0041475E EB 49 jmp wmain+229h (4147A9h)
case 100:
puts("100");
00414760 8B F4 mov esi,esp
00414762 68 4C 77 41 00 push offset string "100" (41774Ch)
00414767 FF 15 3C A4 41 00 call dword ptr [__imp__puts (41A43Ch)]
0041476D 83 C4 04 add esp,4
00414770 3B F4 cmp esi,esp
00414772 E8 50 CA FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
break;
00414777 EB 30 jmp wmain+229h (4147A9h)
case 1000:
puts("1000");
00414779 8B F4 mov esi,esp
0041477B 68 74 78 41 00 push offset string "1000" (417874h)
00414780 FF 15 3C A4 41 00 call dword ptr [__imp__puts (41A43Ch)]
00414786 83 C4 04 add esp,4
00414789 3B F4 cmp esi,esp
0041478B E8 37 CA FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
break;
00414790 EB 17 jmp wmain+229h (4147A9h)
default:
puts("oops!");
00414792 8B F4 mov esi,esp
00414794 68 1C 78 41 00 push offset string "oops!" (41781Ch)
00414799 FF 15 3C A4 41 00 call dword ptr [__imp__puts (41A43Ch)]
0041479F 83 C4 04 add esp,4
004147A2 3B F4 cmp esi,esp
004147A4 E8 1E CA FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
break;
}
mydo 2008-10-14
  • 打赏
  • 举报
回复
看一下反汇编后的代码,会发现两者都会分支跳转,但跳转的方式不一样。

一般从汇编角度来说witch速度更快。



int i;
cin>>i;
if(i==0)
cout<<0<<endl;
else if(i==10)
cout<<10<<endl;
else if(i==100)
cout<<100<<endl;
else if(i==1000)
cout<<1000<<endl;
else
cout<<"oops"<<endl;

cout<<"now switch turn"<<endl;

switch(i)
{
case 0:
puts("0");
break;
case 10:
puts("10");
break;
case 100:
puts("100");
break;
case 1000:
puts("1000");
break;
default:
puts("oops!");
break;
}


从debug反汇编可以看出if()是以cmp机器码作跳转,而switch是构造跳转表跳转:

PART1:

int i;
cin>>i;
0041459E 8B F4 mov esi,esp
004145A0 8D 45 F8 lea eax,[i]
004145A3 50 push eax
004145A4 8B 0D 78 A3 41 00 mov ecx,dword ptr [MSVCP80D_NULL_THUNK_DATA (41A378h)]
004145AA FF 15 7C A3 41 00 call dword ptr [__imp_std::basic_istream<char,std::char_traits<char> >::operator>> (41A37Ch)]
004145B0 3B F4 cmp esi,esp
004145B2 E8 10 CC FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
if(i==0)
004145B7 83 7D F8 00 cmp dword ptr [i],0
004145BB 75 33 jne wmain+70h (4145F0h)
cout<<0<<endl;
004145BD 8B F4 mov esi,esp
004145BF A1 3C A3 41 00 mov eax,dword ptr [__imp_std::endl (41A33Ch)]
004145C4 50 push eax
004145C5 8B FC mov edi,esp
004145C7 6A 00 push 0
004145C9 8B 0D 38 A3 41 00 mov ecx,dword ptr [__imp_std::cout (41A338h)]
004145CF FF 15 44 A3 41 00 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A344h)]
004145D5 3B FC cmp edi,esp
004145D7 E8 EB CB FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
004145DC 8B C8 mov ecx,eax
004145DE FF 15 34 A3 41 00 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A334h)]
004145E4 3B F4 cmp esi,esp
004145E6 E8 DC CB FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
004145EB E9 D6 00 00 00 jmp wmain+146h (4146C6h)
else if(i==10)
004145F0 83 7D F8 0A cmp dword ptr [i],0Ah
004145F4 75 33 jne wmain+0A9h (414629h)
cout<<10<<endl;
004145F6 8B F4 mov esi,esp
004145F8 A1 3C A3 41 00 mov eax,dword ptr [__imp_std::endl (41A33Ch)]
004145FD 50 push eax
004145FE 8B FC mov edi,esp
00414600 6A 0A push 0Ah
00414602 8B 0D 38 A3 41 00 mov ecx,dword ptr [__imp_std::cout (41A338h)]
00414608 FF 15 44 A3 41 00 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A344h)]
0041460E 3B FC cmp edi,esp
00414610 E8 B2 CB FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
00414615 8B C8 mov ecx,eax
00414617 FF 15 34 A3 41 00 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A334h)]
0041461D 3B F4 cmp esi,esp
0041461F E8 A3 CB FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
00414624 E9 9D 00 00 00 jmp wmain+146h (4146C6h)
else if(i==100)
00414629 83 7D F8 64 cmp dword ptr [i],64h
0041462D 75 30 jne wmain+0DFh (41465Fh)
cout<<100<<endl;
0041462F 8B F4 mov esi,esp
00414631 A1 3C A3 41 00 mov eax,dword ptr [__imp_std::endl (41A33Ch)]
00414636 50 push eax
00414637 8B FC mov edi,esp
00414639 6A 64 push 64h
0041463B 8B 0D 38 A3 41 00 mov ecx,dword ptr [__imp_std::cout (41A338h)]
00414641 FF 15 44 A3 41 00 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A344h)]
00414647 3B FC cmp edi,esp
00414649 E8 79 CB FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
0041464E 8B C8 mov ecx,eax
00414650 FF 15 34 A3 41 00 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A334h)]
00414656 3B F4 cmp esi,esp
00414658 E8 6A CB FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
0041465D EB 67 jmp wmain+146h (4146C6h)
else if(i==1000)
0041465F 81 7D F8 E8 03 00 00 cmp dword ptr [i],3E8h
00414666 75 33 jne wmain+11Bh (41469Bh)
cout<<1000<<endl;
00414668 8B F4 mov esi,esp
0041466A A1 3C A3 41 00 mov eax,dword ptr [__imp_std::endl (41A33Ch)]
0041466F 50 push eax
00414670 8B FC mov edi,esp
00414672 68 E8 03 00 00 push 3E8h
00414677 8B 0D 38 A3 41 00 mov ecx,dword ptr [__imp_std::cout (41A338h)]
0041467D FF 15 44 A3 41 00 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A344h)]
00414683 3B FC cmp edi,esp
00414685 E8 3D CB FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
0041468A 8B C8 mov ecx,eax
0041468C FF 15 34 A3 41 00 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A334h)]
00414692 3B F4 cmp esi,esp
00414694 E8 2E CB FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
else
00414699 EB 2B jmp wmain+146h (4146C6h)
cout<<"oops"<<endl;
0041469B 8B F4 mov esi,esp
0041469D A1 3C A3 41 00 mov eax,dword ptr [__imp_std::endl (41A33Ch)]
004146A2 50 push eax
004146A3 68 14 7A 41 00 push offset string "oops" (417A14h)
004146A8 8B 0D 38 A3 41 00 mov ecx,dword ptr [__imp_std::cout (41A338h)]
004146AE 51 push ecx
004146AF E8 B9 CA FF FF call std::operator<<<std::char_traits<char> > (41116Dh)
004146B4 83 C4 08 add esp,8
004146B7 8B C8 mov ecx,eax
004146B9 FF 15 34 A3 41 00 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A334h)]
004146BF 3B F4 cmp esi,esp
004146C1 E8 01 CB FF FF call @ILT+450(__RTC_CheckEsp) (4111C7h)
zmlovelx 2008-10-14
  • 打赏
  • 举报
回复
看编译器实现
一般switch(x)中的x各种case值比较集中的话 它可能用跳转表实现 这时候就比if-else快了
否则可能采用,if-else与跳转表的结合
所以有时候它们的汇编会是一样的。

cc27231583 2008-10-14
  • 打赏
  • 举报
回复
汗,我刚开始学习C++
今天刚好碰到个关于SWITCH的问题,现在明白了 CASE后面的定义编译的时候不能通过。多谢了

内容概要:本文围绕不确定环境下的多式联运路径优化问题展开研究,提出并实现了基于AFO算法、遗传算法(GA)和粒子群优化算法(PSO)的三种智能优化方法,并借助Matlab平台完成算法编程与仿真。研究构建了考虑时间、成本、转运风险等多重不确定因素的路径优化模型,系统比较了AFO、GA、PSO三种算法在收敛速度、全局寻优能力和稳定性方面的表现,同时引入Matlab自带的全局优化搜索器作为基准对照,深入分析各算法在复杂物流网络中的适用边界与性能差异。研究表明,AFO算法在解决此类组合优化问题时展现出快的收敛效率和强的局部规避能力。; 适合人群:具备一定Matlab编程基础与运筹优化知识,从物流工程、交通运输规划、智能算法开发等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多式联运、综合货运网络中的路径决策支持系统构建;②为不确定性条件下复杂路径规划问题提供智能算法选型依据与技术实现方案;③支持科研人员复现主流优化算法并开展横向性能对比实验,推动算法改进与实际落地。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析算法实现流程,重点理解目标函数设计、约束条件处理及参数敏感性分析部分,可通过调整问题规模与算法参数进行对比实验,进一步拓展至动态路径规划或大规模网络优化等延伸场景。
内容概要:本文研究了基于QLearning自适应强化学习的PID控制器在自主水下航行器(AUV)运动控制中的应用,通过Matlab代码实现了控制算法的仿真验证。该方法融合强化学习的在线自适应能力与传统PID控制的稳定性优势,利用QLearning算法动态优化PID控制器的比例、积分、微分参数,以应对水下复杂流体环境、模型不确定性及外部干扰等挑战,从而提升AUV轨迹跟踪的精度、鲁棒性与动态响应性能。文中系统阐述了AUV的六自由度非线性动力学建模过程、QLearning算法的状态空间与动作空间设计、奖励函数构造及训练机制,并详细说明了PID参数自整定的闭环控制架构。仿真结果表明,相较于传统固定参数PID控制器,该智能控制策略在多种工况下均展现出优的控制效果,有效抑制了超调,加快了响应速度,并增强了抗干扰能力。; 适合人群:具备自动控制理论、强化学习基础及Matlab/Simulink仿真能力,从水下机器人、智能控制、海洋工程、自动化等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于AUV、UUV等无人水下平台的高精度自主导航与运动控制;②为解决非线性、强耦合、时变系统的控制器参数自适应整定问题提供智能化解决方案;③作为强化学习与经典控制理论深度融合的技术范例,推动智能控制算法在海洋装备中的工程化应用。; 阅读建议:建议读者结合提供的Matlab代码深入理解算法实现细节,重点剖析QLearning的状态-动作-奖励机制设计、PID参数新逻辑及仿真对比实验结果,有条件者可在复杂的动力学模型或实际硬件平台上进一步验证与优化算法性能。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧