【问题标题】:C++ function returning bool not executed [duplicate]C ++函数返回bool未执行[重复]
【发布时间】:2015-07-27 04:07:54
【问题描述】:

给定一个 C++ 函数 foo:

bool foo();

还有下面几行代码

bool some_bool = false;
some_bool = some_bool and foo();

我观察到foo() 没有被调用,尽管它可能有副作用。这种行为的名称是什么,它是否依赖于编译器?

【问题讨论】:

  • some_bool and foo()
  • 我猜and 是一个扩展为&& 或类似反常的宏。
  • @Michael 和@TartanLlama 实际上是valid keyword in C++,是&& 的别名。
  • @TartanLlama 不,and 是关键字,与 && 同义。
  • 呵呵,你学到了新东西。

标签: c++


【解决方案1】:

这叫short-circuit evaluation

在您的示例中,some_bool 为假,因此声明 some_bool && foo() 始终为假。所以永远不需要评估foo()

请注意,这是标准 C/C++,并且不依赖于编译器,因为它可能会导致您发现的代码无法执行。

编写代码的更好方法是:

bool some_bool = false;
bool foo_result = foo();
some_bool = some_bool && foo_result;

【讨论】:

  • 称其为“更好”是幼稚的。正如您所指出的,这两个是不同的程序。您的版本与 OP 的版本不同。那么,如果它实际上没有达到 OP 的要求,它会自动“更好”吗? (反之亦然)
  • 我不明白你在说什么。原始代码确实被破坏并且不起作用。这里的版本可以。除非 OP 的意图是编写损坏的代码,否则它会“更好”。
  • 问题中没有任何内容表明代码“损坏”或“不起作用”。这是一个关于短路是否可靠的问题。你是否真的想要它取决于具体情况:一般来说,你不能说一个比另一个“更好”。
【解决方案2】:

如果some_bool 已经为假,则不会调用foo()(优化),因为无论foo() 返回什么,最终结果始终为假。

【讨论】:

  • @juanchopanza 感谢您提供的信息。很高兴我学到了一些新东西。
  • 将其称为“优化”听起来像是一种可选的编译器行为。这不是“优化”。这是具有严重后果的语言语义的可靠事实。 “优化”倾向于描述编译器采用捷径不改变语义
  • 这很重要,因为它的发生与您是否在编译器中使用优化无关。
猜你喜欢
  • 2016-01-10
  • 2020-05-12
  • 2021-11-11
  • 1970-01-01
  • 2023-02-10
  • 2023-03-23
  • 2018-09-21
  • 2017-04-09
  • 1970-01-01
相关资源
最近更新 更多