VB转学VC的switch困惑

刚从VB转学VC,发现但switch语句与select case 很相似,其实它们有很大的不同!
第一,select case语句case部分表达式很灵活,而switch语句中的case部分只能接受常量,所以当取值在一定范围的时候,就必须一一枚举出来。看不去不如VB灵活,其实这样的结构目的是通过构造特殊的二进制编码并利用寄存器技术提高效率,而VB中的select case语句最终还是转化为if else,所以两者的执行效率上有很大的差别。
第二,两者处理流程上的不同,select case中每个case部分执行完之后,就会跳出循环,而switch中如果没有遇到break,则会继续执行下去。
其实在C++内部,是将case部分作为标号处理的。
如下面一个switch语句:
  1. switch(i)
  2. {
  3. case1:
  4. cout<<"1";
  5. case2:
  6. cout<<"2";
  7. case3:
  8. cout<<"3";
  9. }

其实是这样处理的:
  1. int_lbl=i;
  2. goto_lbl;
  3. 1:
  4. cout<<"1";
  5. 2://A
  6. cout<<"2";
  7. 3://B
  8. cout<<"3";


这样如果i等于2,就跳到A行,输出2,然后忽略掉B行这个标号,继续向下执行。这个功能很灵活,但很多人不理解,为什么不在case标号的后面内置一个break,其实如果这样做的话,就会限制C++的灵活性!
举个例子:
计算1000元以下商品让利折扣,两百元以下让利五元,四百元以下让利十元,六百元以下让利2%,再让利十元,八百元以下让利3%,然后余额再让利2%,再让利十元,一千元以下让利5%,然后余额再让利3%,然后再次让利2%,再让利十元.

  1. doublevalue=0;
  2. doublemoney=232.5;
  3. doubleb_money=money;
  4. switch((int)money/100)
  5. {
  6. case9:
  7. case8:
  8. value=money*0.05;
  9. money=money-value;
  10. case7:
  11. case6:
  12. value=money*0.03;
  13. money=money-value;
  14. case5:
  15. case4:
  16. value=money*0.02;
  17. money=money-value;
  18. case3:
  19. case2:
  20. money-=10;
  21. break;
  22. default:
  23. money-=5;
  24. }
  25. value=b_money-money;
  26. cout<<value;


这正是利用了switch的"跨case"特性,使程序简明清晰!

完整代码:
  1. #include<iostream>
  2. usingspacenamestd;
  3. voidmain()
  4. {
  5. doublevalue=0;
  6. doublemoney=832.5;
  7. doubleb_money=money;
  8. switch((int)money/100)
  9. {
  10. case9:
  11. case8:
  12. value=money*0.05;
  13. money=money-value;
  14. case7:
  15. case6:
  16. value=money*0.03;
  17. money=money-value;
  18. case5:
  19. case4:
  20. value=money*0.02;
  21. money=money-value;
  22. case3:
  23. case2:
  24. money-=10;
  25. break;
  26. default:
  27. money-=5;
  28. }
  29. value=b_money-money;
  30. cout<<value;
  31. }
代码在winxp,vc2005下实现

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...