gpt4 book ai didi

没有选择语句的 C++ 条件

转载 作者:太空狗 更新时间:2023-10-29 23:35:27 25 4
gpt4 key购买 nike

可能是受Perl的影响,我喜欢用下面的语法

condition && do_something();

代替

if ( condition )
{
do_something();
}

(我知道我可以在没有大括号的情况下将后者排成一排,但这不是重点。)

我做了几个测试(如下),都有效。但是我在标准中找不到引用,说明它是合法的。它可以隐含在

  • 5.14 逻辑与运算符
  • 5.17 赋值运算符
  • 6.4。选择陈述

但我不完全确定(我检查了 C++ 98,很抱歉是老式的,但即使是 C 标准也可能就足够了)。

注意:我确实意识到为了工作,最后一个表达式 (do_something) 也必须可以转换为 bool,这对于选择语句来说不是必需的。这当然是一个严重的限制。

所以问题是:

  1. 这完全合法吗?
  2. 是否有不使用它的理由?
  3. 是否存在可能的副作用(例如导致意外结果的优化)?

很抱歉,如果结果是重复的,我找不到任何东西,但可能是因为我没有使用正确的关键字。

#include <cassert>

bool sayYes()
{
return true;
}

bool sayNo()
{
return false;
}

int main( int args, char* argv[] )
{
bool a = true;
bool b = false;
int i = 0;

a && ( i = 1 );
assert( i == 1 );

!a && ( i = 0 );
assert( i == 1 );

( a || b ) && ( i = 0 );
assert( i == 0 );

sayYes() && ( i = 1 );
assert( i == 1 );

( sayNo() || sayYes() ) && ( i = 0 );
assert( i == 0 );

return 0;
}

最佳答案

这是完全合法的。来自 [expr.log.and]:

&& guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false.

expr() && fun() 等同于 if (expr()) fun()(假设 fun() 返回一些东西可转换为 bool)。在编写复合条件表达式时,这是一个极其重要的属性。例如,只有在我们知道指针有效后才取消引用它:

if (ptr && ptr->foo()) { ... }

也就是说,如果您真正想要的是:

if (expr()) {
fun();
}

就这么写吧。无论哪种方式,编译器都会生成相同的代码,但您尝试执行的操作的意图会更加清晰。

关于没有选择语句的 C++ 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36578111/

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