bool短路的&=和| =运算符?

iFr*_*cht 38 c++ boolean lazy-evaluation short-circuiting compound-assignment

在C++中编写这样的代码时:

bool allTrue = true;
allTrue = allTrue && check_foo();
allTrue = allTrue && check_bar();
Run Code Online (Sandbox Code Playgroud)

check_bar()如果check_foo()退回,将不会被评估false.这称为短路或短路评估,是惰性评估原则的一部分.

这是否适用于复合赋值运算符&=

bool allTrue = true;
allTrue &= check_foo();
allTrue &= check_bar(); //what now?
Run Code Online (Sandbox Code Playgroud)

用逻辑OR替换所有&with |truewith false.

pax*_*blo 44

从C++ 11开始5.17 Assignment and compound assignment operators:

形式E1 op = E2的表达式的行为等同于E1 = E1 op E2,除了E1仅被评估一次.

但是,你混淆了逻辑并不会短路,以及按位和从来不会.

标准文件中无处可找到文本片段&&=,您将如何处理您所要求的内容.原因是它实际上并不存在:没有逻辑和赋值运算符.

  • @iFreilicht,C没有它,因为Dennis Ritchie显然_didn't_认为它没有用(我们可以直接询问他是否没有拖垮这个致命的线圈,让我们中的许多人更少).ANSI C没有它,因为他们的任务是编纂现有的做法,而不是创造一种新的语言.ISO没有它,因为它们基本上是橡皮图章ANSI(不是很糟糕).从那时起它就没有被添加到C中,因为它既没有作为提案提出,也没有提出,也没有获得足够的选票.我认为我不能提供更多细节:-) (10认同)
  • @iFreilicht:有什么_具体_原因吗?可能是因为 C 从来没有它,而最初的 C++ 编译器或多或少只是 C 的前端,意味着“带有类的 C”,而不是“带有类和几个额外运算符的 C”:-) (3认同)
  • 我的错,这可能只是一厢情愿的想法.你知道C++没有`&& =`运算符的具体原因吗? (2认同)
  • @paxdiabla soooo为什么没有C呢?我的意思是它对我来说肯定是一件有用的事情,实现它也不会太难. (2认同)
  • @iFreilicht:没有很多情况下`x && = y;`会很有用.如果`x`和`y`都知道为零或一,那么`if(x)x = y;`会更有效[实际上,我希望`x && y`已被定义为产生`y`如果`x`不是零,但是这已经太晚了几十年. (2认同)

Woj*_*wka 11

短路(即懒惰)评估仅适用于逻辑&&||.按位&|评估两个参数.


que*_*atl 8

不,他们不会做空.

请注意,&=|=运算符形成为&+ =|+ =.位运算符 &|不执行快捷评估.

只有布尔运算符 &&||执行它.

这意味着,一个快捷操作符必须传统上命名&&=||=.有些语言提供它们.C/C++没有.


Dan*_*vil 7

第一:a &= b;与 不一样a = a && b;a &= b;方法a = a & b;。在 C/C++ 中没有a &&= b;.

逻辑 ANDa && b有点像 1 位的测试。如果第一个“位”已经是 0,那么无论第二个“位”如何,结果都将始终为 0。因此没有必要评估b结果是否已经清楚a。C/C++ 标准允许这种优化。

按位 AND对和a & b的所有位执行此测试。因此需要评估是否至少有一位非零。您可能希望不计算 if , then ,但 C/C++ 中不允许这种优化。abbaa==0b


小智 5

该代码allTrue &= check_foo();相当于allTrue = allTrue & check_foo() 您正在使用的代码bitwise AND,并且不执行延迟计算。

必须bitwise AND采用两个二进制表示具有相同长度的参数,并使用logical AND操作来比较每个相应的位对。

  • 很确定您可以使用“&”和“|”进行整数提升,即。`uint16_t x = 0xabcd; uint8_t y = 0xef;uint16_t z = x | y;// z = 0xabef`,所以说要求“二进制表示具有相同的长度”是不是真的? (2认同)