在使用if,else if,else if,...和使用switch(){case A:... case B:...}之间C和C++是否有任何区别?

bod*_*ydo 6 c

我感兴趣的是,如果我使用C或C++编译器的观点有什么不同:

if (value == a) {
    ...
}
else if (value == b) { 
    ...
}
else if (value == c) { 
    ...
}
Run Code Online (Sandbox Code Playgroud)

switch (value) {
    case a:
        ...
        break;
    case b:
        ...
        break;
    case c:
        ...
        break;
}
Run Code Online (Sandbox Code Playgroud)

我觉得没有区别,只有句法.有谁知道更多吗?

谢谢,Boda Cydo.

Jer*_*fin 8

是的,存在差异.级联ifs保证按顺序评估条件.该开关仅保证对用作开关参数的任何内容进行单一评估.根据编译器的不同,无论选择的分支如何,交换机通常都会花费(几乎)恒定的时间,而if级联几乎可以保证第一条腿最快,第二条腿速度最快,依此类推,直到最后一条最慢.

  • 这不是那么简单.如果条件没有副作用(如在OP中),编译器可以很容易地重新排序if/else.例如,[gcc](http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Optimize-Options.html#Optimize-Options)可以使用`-freorder-blocks`和`-fguess分支 - probability`.在某些情况下,编译器也可以从if级联生成跳转表.最后,如果值太稀疏,`switch`语句将不会产生跳转表. (2认同)

ada*_*amk 6

存在差异 - 对于交换机,编译器可以优化交换机以使用查找表.如果有许多值彼此足够接近,则这是可能的.例如,这个开关:

switch ( integer ) {
  case 10:
     xxx
     break;
  case 12:
     yyy
     break;
  case 13
     zzz
     break;
}
Run Code Online (Sandbox Code Playgroud)

可能成为(伪代码):

address = lookup[ integer - 10 ]; // which is prefilled with { case_10, err, err, case_12, case 13 }
goto address;
case_10: xxx; goto err;
case_12: yyy; goto err;
case_13: zzz; 
err: //do nothing
Run Code Online (Sandbox Code Playgroud)