C ++中的短路评估和分配

时间:2018-03-27 07:21:07

标签: c++

在C ++中是否可以这样:

if (int* x = (foo() || bar()))
{
    // do something with x
}
else
{
    // do something else if both foo() and bar() return nullptr
}

我知道代码不会编译(不能将bool转换为int *),但是有没有一个有效的等效“快捷”代码才能做到这种快捷方式?基本上,我想要的是如果foo()没有返回空指针,则将foo()的返回值赋给x。如果foo()产生一个空指针,则将bar()的返回值赋给x。

假设foo()和bar()是昂贵的计算,因此需要最小化对它们的调用次数。如果foo()没有产生空指针,那么理想情况下,就不需要调用bar()。

3 个答案:

答案 0 :(得分:5)

使用new C++17 feature,应该可以使用以下内容:

if(int* x = foo(); x = x ? x : bar())

Pre-C ++ 17将要求你在外面声明x(以下通过避免自我分配来改进上面;谢谢,N00byEdge):

int* x;
if(x = foo(), x ? x : (x = bar()))

然而,可能在外面移动作业更好:

int* x = foo();
if(x ? x : (x = bar()))

在上述所有情况下,编译器可能会警告您,您可能会将分配与比较混为一谈(=而不是==);为了使编译器知道要进行赋值,您可以在赋值周围添加其他括号...

编辑:freestyle发布的精彩解决方案,遗憾的是仅作为评论(此处,括号必需,因为分配的优先级低于逻辑或者):

int* x;
if((x = foo()) || (x = bar()))

假设C ++ 17,可以看一下,就像这样:

if(int* x; (x = foo()) || (x = bar()))

或根据以下内容完善自己的答案:

if(int* x = foo(); x || (x = bar()))

答案 1 :(得分:0)

int* y = foo();    
int* x = y == NULL ? bar() : y;

答案 2 :(得分:-2)

int * x{foo()};
if(!x)
{
  x = bar();
}
if(!x)
{
   // report error
}
// do something with x