条件运算符总是可以用if / else替换?

时间:2010-12-17 22:00:35

标签: c++ conditional-operator

到目前为止,我认为条件运算符int a = b == 2 ? x1 : x2;始终可以用if / else语句替换。

int a;
if (b == 2)
  a = x1;
else
  a = x2;

两者中的一个之间的选择总是一个品味问题。今天我正在处理一个任务,如果我可以写一个参考将是有用的:

int& a;
if (b == 2)
  a = x1;
else
  a = x2;

这是不允许的,我尝试使用条件运算符初始化引用。这是有效的,我开始意识到,条件运算符并不总是可以用if / else语句替换。

我对这个结论是对的吗?

8 个答案:

答案 0 :(得分:11)

你是对的。条件运算符是表达式,而if-else语句。可以在可以使用语句的地方使用表达式,但事实恰恰相反。

这是一个很好的反例,可以说明当你遇到一个坚持认为你永远不应该永远不会使用条件表达式的人时,因为if-else是“简单”而条件“太复杂”。 / p>

当C ++获取lambda表达式时,您可以使用带有if-else的lambda代替条件。

答案 1 :(得分:2)

嗯,显然有很多地方你不能放置if。例如:

func( x ? 0 : 1 );

用if语句无法写出来。这是一个骗局,好几次,不是因为我找不到而责备你,因为我做不到。

答案 2 :(得分:2)

不完全是。您始终可以用指针(可重新安装)替换参考(不可重新安装)。所以这是一个背景问题。

E.g。你可以写

int* pa;
if( b == 2 )
    pa = &x1;
else
    pa = &x2;
int& a = *pa;

没问题,就像有人曾经向终结者发表评论一样。

全力以赴“呃”效果,

int* pa;
switch( b == 2 )
{
case true:
    pa = &x1;  break;
default:
    pa = &x2;
}
int& a = *pa;

但在这种情况下,条件运算符更清楚。 : - )

int& a = (b == 2? x1 : x2);

干杯&第h。,

答案 3 :(得分:2)

你会遇到更多问题

// works
ostream *o;
if(x)
  o = &myfiles;
else
  o = &mystrings;


// stringstream* and fstream* -- incompatible!
ostream *o = x ? &myfiles : &mystrings;

答案 4 :(得分:1)

你是对的。

在C ++中存在条件赋值情况,其中使用if-else语句是不可能的,因为该语言明确区分了初始化和赋值。

此外,三元运算符可以产生左值,即可以赋值的值。

此外,在某些情况下,某些编译器可能会为三元与条件if-then生成不同的代码。例如,如果使用三元运算符,GCC会执行更好的代码优化。

另见?: ternary operator in C++

答案 5 :(得分:1)

你不能直接使用它,但是你可以通过将条件转换为被表达为表达式的东西来解决这个限制......

int& initValue(int b, int& x1, int& x2){
    if (b==2)
        return x1;
    return x2;
}

...

int& a = initValue(b, x1, x2);

当然,这对于整体而言可能有点过分。

答案 6 :(得分:0)

这取决于您对可更换的定义。例如,在单个函数调用中,我不能用if-else替换以下条件运算符。

int n1 = 10;
int n2 = 20;
const int& i = x > 0 ? n1 : n2;

然而,通过添加另一个函数,我已经用if-else有效地替换了条件运算符。

const int& get_i(double x)
{
  if(x > 0)
    return n1;
  else
    return n2;
}

int main()
{
  const int& i = get_i(x);
}

答案 7 :(得分:0)

根据 kodify.net,我们不能用条件运算符替换每个 if/else 语句。这样做有两个要求:ifelse 块中必须有一个表达式。