首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用按位运算符而不是逻辑运算符吗?

我可以使用按位运算符而不是逻辑运算符吗?
EN

Stack Overflow用户
提问于 2016-10-31 11:07:10
回答 5查看 2.5K关注 0票数 9

位运算符在位上工作,逻辑运算符计算布尔表达式。只要表达式返回bool,为什么不使用按位运算符而不是逻辑运算符呢?

在本例中,我使用按位而非逻辑的方法:

代码语言:javascript
复制
#include <iostream>


int main(){

    int age;
    std::cin >> age;

    if( (age < 0) | (age > 100) ) // eg: -50: 1 | 0 = 1
        std::cout << "Invalid age!" << std::endl;

//  if( (age < 0) || (age > 100) )
//      std::cout << "Invalid age!" << std::endl;

  return 0;
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-10-31 11:12:42

一个可能的答案是:优化。例如:

代码语言:javascript
复制
if ((age < 0) | (age > 100))

假设是age = -5,不需要计算(age > 100),因为满足了第一个条件(-5<0)。但是,前面的代码将计算不需要的(age > 100)表达式。

通过以下方式:

代码语言:javascript
复制
if ((age < 0) || (age > 100))

只对第一部分进行评估。

注: As @Lundin在评论中提到,由于第二个选项分支的准确性(以及错误预测的问题),|有时比||更快。因此,在其他表达式非常便宜的情况下,选项可能会更快。因此,在这些情况下了解代码的唯一方法是在目标平台上对代码进行基准测试。

最重要的答案是避免未定义的行为和错误:

您可能会想到以下代码:

代码语言:javascript
复制
int* int_ptr = nullptr;
if ((int_ptr != nullptr) & (*int_ptr == 5))

此代码包含未定义的行为。但是,如果将&替换为&&,则不再存在未定义的行为。

票数 13
EN

Stack Overflow用户

发布于 2016-10-31 11:12:19

你不应该。假设你收到了两个值,只有当它们都是非零的时候,你才能继续。

代码语言:javascript
复制
int b = foo(1); // returns 0x1
int c = foo(2); // returns 0x2

结果如下所示:b && c == true,而b & c == 0

代码语言:javascript
复制
if (b && c)
{
  // This block will be entered
}

if (b & c)
{
  // This block won't
}
票数 3
EN

Stack Overflow用户

发布于 2016-10-31 11:55:25

|||有着明显的差异。

与语言中的大多数其他运算符不同,逻辑||运算符显式地指定了计算顺序。必须在第二个操作数之前计算||的第一个操作数。第二项根本不需要评估。

这从根本上不同于作为大多数运算符的|:计算顺序未指定,这两个表达式都将进行计算。即使在一个操作数被发现为非零的情况下,另一个操作数仍将被评估为副作用。

这意味着像f1() || f2()这样的代码总是要计算到这个伪代码:

代码语言:javascript
复制
if(f1() != 0)
{
  f2();
}

f1() | f2()将以程序员所不知道的未指定的顺序执行这两个函数。

这也意味着,像“比”更快的语句,是天真的。当然,对于||,不一定要计算第二个操作数,但这是以一个分支为代价的,以及对编译器如何重新排序表达式的限制。哪个运算符通常速度更快并不明显。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40340935

复制
相关文章

相似问题

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