在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()。
答案 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