【问题标题】:Turn off || operator optimization关闭||算子优化
【发布时间】:2019-04-07 03:43:29
【问题描述】:

VS C++ 2017 中是否有任何选项,以便在构建以下程序时同时调用 f()g()

#include <iostream>
using namespace std;
bool f()
{
    cout << "f" "\n";
    return true;
}
bool g()
{
    cout << "g" "\n";
    return false;
}
int main()
{

    if (f() || g())
        cout << "hello";
    cin.ignore(1);
}

【问题讨论】:

  • 你不能“关闭”核心语言的一部分。
  • 那不是优化,那是短路。
  • @Swordfish 在某些情况下你可以......不是这个。
  • @MM 嗯?例如?
  • 有些编译器有关闭异常的开关,或者类型兼容性要求,

标签: c++ short-circuiting


【解决方案1】:

不,没有,这种行为(短路)基本上是逻辑运算符的一部分。

您可以改为使用按位或运算符|。但请务必添加评论,说明这不是错误,而是故意的!

在任何情况下,如果您的函数调用不像f() 那样简单,您应该考虑引入一个单独的变量(或多个变量),以使您的代码在做什么更明显(无条件调用两个函数,然后同时使用这两个函数)它们的返回值)。

【讨论】:

  • 注释可能与代码不同步(例如,如果发生变化,程序员会因为不更新 cmets 以匹配代码的意图而臭名昭著)。作为粗略的规则,依靠 cmets 来解释该代码不会出错,即使它看起来像一个错误,也是不使用该代码的一个很好的理由。引入“一个单独的变量(或多个变量)”实际上是解决问题的更正确且不易出错的解决方案。
【解决方案2】:

短路评估是语言规范的一部分。你不能把它关掉。 您可以改为将 f()g() 调用分配给变量,然后评估它们:

bool f_ret = f();
bool g_ret = g();
if (f_ret || g_ret)
    cout << "hello"; 

【讨论】:

  • 您可以使用if (auto f_ = f(), g_ = g(); f_ || g_),而不是将变量引入范围
【解决方案3】:

如果您至少有一个函数返回一个定义了 operator|| 的 UDT:

#include <iostream>

struct my_bool
{
    bool value;
    my_bool(bool value) : value{ value } {}
    operator bool() const { return value; };
    my_bool operator||(my_bool rhs) const { return value || rhs.value; }
};

my_bool f()
{
    std::cout << "f()\n";
    return true;
}

my_bool g()
{
    std::cout << "g()\n";
    return false;
}

int main()
{

    if (f() || g())
        std::cout << "hello\n";
}

双方都将被评估。

但是。你。别。想。到。做。那个。*)

*) 除非目标是编写混淆代码;)

【讨论】:

  • 如果您的operator||() 接受my_bool 类型的参数并返回my_bool,它将更适用。照原样,f() || x() || y() 其中x()y() 各自返回bool 不会调用y(),这不是解决方案所期望的。
  • @彼得。正确的。改变了。
【解决方案4】:

可能最简单的解决方案是编写:

if (f()+g())
    cout << "hello";

输出:

f
g
hello

操作员+ 没有任何“短路评估”。逻辑上,表达式f() + g() 等价于f() || g(),原因如下:运算符+ 的操作数被转换为整数值,其中false 给出0true 给出1。然后f() + g() 的结果在0..2 之间的范围内。由于此整数结果用于预期布尔值,因此将其转换回布尔值,其中0 被视为false,而所有&gt;0 都被视为true

【讨论】:

  • 如果添加的任何函数返回 bool 以外的值,则可能会对此解决方案感到震惊。考虑如果g() 因某种原因更改为返回int,并在指定条件下返回01-1 的值,会发生什么情况。对于所有返回-1 的情况,f() + g() 将返回0 的结果,即使f() 返回true
猜你喜欢
  • 2012-04-28
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 2016-01-19
  • 2012-10-04
  • 2021-01-30
相关资源
最近更新 更多