C ++条件运算符与if-else

时间:2012-11-24 21:41:07

标签: c++ conditional operator-keyword if-statement

我一直在想这个。假设我们有一个变量,字符串权重和一个输入变量int模式,它可以是1或0.

使用有明显的好处:

weight = (mode == 1) ? "mode:1" : "mode:0";

if(mode == 1)
    weight = "mode:1";
else
    weight = "mode:0";

超出代码可读性?是否所有受影响的速度都由编译器处理(例如某些switch语句转换为跳转表的能力)?

3 个答案:

答案 0 :(得分:3)

条件运算符和if / else块之间的关键区别在于条件运算符是表达式而不是语句。因此,您可以使用条件运算符的地方很少,您不能使用if / else。例如,初始化常量对象,如:

const double biasFactor = (x < 5) ? 2.5 : 6.432;

如果在这种情况下使用if / else,biasFactor必须是非const。

另外,构造函数初始值设定项列出了对表达式而不是语句的调用:

X::X()
  : myData(x > 5 ? 0xCAFEBABE : OxDEADBEEF)
{
}

在这种情况下,myData可能没有定义任何赋值运算符或非const成员函数 - 它的构造函数可能是将任何参数传递给它的唯一方法。

另外,请注意,任何表达式都可以通过在末尾添加分号来转换为语句 - 反之则不然。

答案 1 :(得分:1)

不,这纯粹是为了向人类读者呈现代码。我希望任何编译器都能为这些生成相同的代码。

答案 2 :(得分:0)

使用mingw,使用

生成汇编代码
const char *  testFunc()
{
    int mode=1;
    const char * weight = (mode == 1)? "mode:1" : "mode:0";
    return weight;
}

是:

testFunc():
0040138c:   push %ebp
0040138d:   mov %esp,%ebp
0040138f:   sub $0x10,%esp
10          int mode=1;
00401392:   movl $0x1,-0x4(%ebp)
11          const char * weight = (mode == 1)? "mode:1" : "mode:0";
00401399:   cmpl $0x1,-0x4(%ebp)
0040139d:   jne 0x4013a6 <testFunc()+26>
0040139f:   mov $0x403064,%eax
004013a4:   jmp 0x4013ab <testFunc()+31>
004013a6:   mov $0x40306b,%eax
004013ab:   mov %eax,-0x8(%ebp)
12          return weight;
004013ae:   mov -0x8(%ebp),%eax
13        }

并且

const char *  testFunc()
{
    const char * weight;
    int mode=1;
    if(mode == 1)
        weight = "mode:1";
    else
        weight = "mode:0";

    return weight;
}

是:

testFunc():
0040138c:   push %ebp
0040138d:   mov %esp,%ebp
0040138f:   sub $0x10,%esp
11          int mode=1;
00401392:   movl $0x1,-0x8(%ebp)
12          if(mode == 1)
00401399:   cmpl $0x1,-0x8(%ebp)
0040139d:   jne 0x4013a8 <testFunc()+28>
13              weight = "mode:1";
0040139f:   movl $0x403064,-0x4(%ebp)
004013a6:   jmp 0x4013af <testFunc()+35>
15              weight = "mode:0";
004013a8:   movl $0x40306b,-0x4(%ebp)
17          return weight;
004013af:   mov -0x4(%ebp),%eax
18        }

几乎生成了相同的代码。您的应用程序的性能不应该依赖于像这样的小细节。

所以,不,它没有什么区别。