第一,select case语句case部分表达式很灵活,而switch语句中的case部分只能接受常量,所以当取值在一定范围的时候,就必须一一枚举出来。看不去不如VB灵活,其实这样的结构目的是通过构造特殊的二进制编码并利用寄存器技术提高效率,而VB中的select case语句最终还是转化为if else,所以两者的执行效率上有很大的差别。
第二,两者处理流程上的不同,select case中每个case部分执行完之后,就会跳出循环,而switch中如果没有遇到break,则会继续执行下去。
其实在C++内部,是将case部分作为标号处理的。
如下面一个switch语句:
- switch(i)
- {
- case1:
- cout<<"1";
- case2:
- cout<<"2";
- case3:
- cout<<"3";
- }
其实是这样处理的:
- int_lbl=i;
- goto_lbl;
- 1:
- cout<<"1";
- 2://A
- cout<<"2";
- 3://B
- cout<<"3";
这样如果i等于2,就跳到A行,输出2,然后忽略掉B行这个标号,继续向下执行。这个功能很灵活,但很多人不理解,为什么不在case标号的后面内置一个break,其实如果这样做的话,就会限制C++的灵活性!
举个例子:
计算1000元以下商品让利折扣,两百元以下让利五元,四百元以下让利十元,六百元以下让利2%,再让利十元,八百元以下让利3%,然后余额再让利2%,再让利十元,一千元以下让利5%,然后余额再让利3%,然后再次让利2%,再让利十元.
- doublevalue=0;
- doublemoney=232.5;
- doubleb_money=money;
- switch((int)money/100)
- {
- case9:
- case8:
- value=money*0.05;
- money=money-value;
- case7:
- case6:
- value=money*0.03;
- money=money-value;
- case5:
- case4:
- value=money*0.02;
- money=money-value;
- case3:
- case2:
- money-=10;
- break;
- default:
- money-=5;
- }
- value=b_money-money;
- cout<<value;
这正是利用了switch的"跨case"特性,使程序简明清晰!
完整代码:
- #include<iostream>
- usingspacenamestd;
- voidmain()
- {
- doublevalue=0;
- doublemoney=832.5;
- doubleb_money=money;
- switch((int)money/100)
- {
- case9:
- case8:
- value=money*0.05;
- money=money-value;
- case7:
- case6:
- value=money*0.03;
- money=money-value;
- case5:
- case4:
- value=money*0.02;
- money=money-value;
- case3:
- case2:
- money-=10;
- break;
- default:
- money-=5;
- }
- value=b_money-money;
- cout<<value;
- }