首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用&&和&优化行为

使用&&和&优化行为
EN

Stack Overflow用户
提问于 2016-09-01 22:28:36
回答 5查看 420关注 0票数 0

考虑一下

代码语言:javascript
复制
 bool Fun1()
{
 ...
}
bool Fun2()
{
}

在主代码中的某个地方我可以

代码语言:javascript
复制
if(Fun1() && Fun2()) //option-1
{
}

代码语言:javascript
复制
if(Fun1() & Fun2()) //option-2 
{
}

似乎在VS2012中,在option-1中,并不能确保在option-2上同时执行这两个函数。具体地说,如果其中一个函数返回false,则不会使用option-1执行其他函数。但是,总体代码需要对它们进行适当的行为评估,我可以使用option-2来实现这一点。我想知道option-2的这种行为是否可以在不同的编译器之间改变(也有优化级别),或者是由标准保证的?

EN

回答 5

Stack Overflow用户

发布于 2016-09-01 22:37:35

Standard明确指出,对于像bool运算符这样的内置类型,&&||是短路的-也就是说,首先计算第一个参数,然后只有当第一个参数没有给出语句的明确答案时才计算第二个参数-即,对于||,它是false,对于&&,它是true

逐位&遵循正常的函数调用规则,因此这两个参数都以未指定的顺序进行计算。

票数 5
EN

Stack Overflow用户

发布于 2016-09-01 22:45:06

Bitwise-&实际上总是同时计算两个操作数。由于as-if规则,编译器无法将其优化。但是像这样的编程是一种代码的味道。考虑一下维护你的代码的人。为什么只有一个&而不是两个?是打字错误吗?等。

我至少会从if语句中删除计算结果。

代码语言:javascript
复制
  bool fun12 = Fun1() & Fun2();
  if (fun12) {
    . . .

此外,您不能将这种方法扩展到非bool函数。您必须首先与0进行比较。

最后,&&计算第一个操作数,然后(可选)计算第二个操作数。&中的评估顺序是未指定的(即随机)。

票数 2
EN

Stack Overflow用户

发布于 2016-09-01 22:44:05

&&具有短路行为,换句话说,如果第一个操作数为false,则不计算第二个操作数。&没有这种行为,所以第二个总是被确定地计算出来。但是,如果您正在处理布尔值,请始终使用&&而不是&,因为&用于逐位操作。对于您的问题,请使用以下代码:

代码语言:javascript
复制
bool a = Fun1();
if(Fun2() && a){
    //Fun2 must be the left operand
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39274289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档