位运算符在位上工作,逻辑运算符计算布尔表达式。只要表达式返回bool,为什么不使用按位运算符而不是逻辑运算符呢?
在本例中,我使用按位而非逻辑的方法:
#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;
}发布于 2016-10-31 11:12:42
一个可能的答案是:优化。例如:
if ((age < 0) | (age > 100))假设是age = -5,不需要计算(age > 100),因为满足了第一个条件(-5<0)。但是,前面的代码将计算不需要的(age > 100)表达式。
通过以下方式:
if ((age < 0) || (age > 100))只对第一部分进行评估。
注: As @Lundin在评论中提到,由于第二个选项分支的准确性(以及错误预测的问题),|有时比||更快。因此,在其他表达式非常便宜的情况下,选项可能会更快。因此,在这些情况下了解代码的唯一方法是在目标平台上对代码进行基准测试。
最重要的答案是避免未定义的行为和错误:
您可能会想到以下代码:
int* int_ptr = nullptr;
if ((int_ptr != nullptr) & (*int_ptr == 5))此代码包含未定义的行为。但是,如果将&替换为&&,则不再存在未定义的行为。
发布于 2016-10-31 11:12:19
你不应该。假设你收到了两个值,只有当它们都是非零的时候,你才能继续。
int b = foo(1); // returns 0x1
int c = foo(2); // returns 0x2结果如下所示:b && c == true,而b & c == 0
if (b && c)
{
// This block will be entered
}
if (b & c)
{
// This block won't
}发布于 2016-10-31 11:55:25
||和|有着明显的差异。
与语言中的大多数其他运算符不同,逻辑||运算符显式地指定了计算顺序。必须在第二个操作数之前计算||的第一个操作数。第二项根本不需要评估。
这从根本上不同于作为大多数运算符的|:计算顺序未指定,这两个表达式都将进行计算。即使在一个操作数被发现为非零的情况下,另一个操作数仍将被评估为副作用。
这意味着像f1() || f2()这样的代码总是要计算到这个伪代码:
if(f1() != 0)
{
f2();
}而f1() | f2()将以程序员所不知道的未指定的顺序执行这两个函数。
这也意味着,像“比”更快的语句,是天真的。当然,对于||,不一定要计算第二个操作数,但这是以一个分支为代价的,以及对编译器如何重新排序表达式的限制。哪个运算符通常速度更快并不明显。
https://stackoverflow.com/questions/40340935
复制相似问题