gpt4 book ai didi

c++ - C++ 中的短路评估和赋值

转载 作者:行者123 更新时间:2023-11-30 02:20:38 27 4
gpt4 key购买 nike

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

最佳答案

new C++17 feature ,以下应该是可能的:

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

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()))

关于c++ - C++ 中的短路评估和赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49506633/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com