这是一段看似非常特殊的C++代码.出于某种奇怪的原因,奇迹般地对数据进行排序使得代码几乎快了六倍.
#include <algorithm>
#include <ctime>
#include <iostream>
int main()
{
// Generate data
const unsigned arraySize = 32768;
int data[arraySize];
for (unsigned c = 0; c < arraySize; ++c)
data[c] = std::rand() % 256;
// !!! With this, the next loop runs faster.
std::sort(data, data + arraySize);
// Test
clock_t start = clock();
long long sum = 0;
for (unsigned i = 0; i < 100000; ++i)
{
// Primary loop
for (unsigned c = 0; c < arraySize; ++c) …Run Code Online (Sandbox Code Playgroud) 为什么更&&喜欢&和||更喜欢|?
我问过多年来一直在编程的人,他的解释是:
例如,在中if (bool1 && bool2 && bool3) { /*DoSomething*/ },bool1必须是真实的,以便bool2在继续之前测试哪个必须为真bool3,等等.如果我使用单个&而不是测试的顺序,即使所有这些都必须是真的进展到下一行,为什么它至关重要?
注意:我想指出我是幼儿的编程,这不是一个严肃或紧迫的问题.更重要的是理解为什么事情应该以某种方式而不是另一种方式完成.
Java和C#等语言都有按位和逻辑运算符.
逻辑运算符只对布尔操作数有意义,按位运算符也适用于整数类型.由于C没有布尔类型并且将所有非零整数视为真,因此逻辑和按位运算符的存在在那里是有意义的.但是,Java或C#等语言具有布尔类型,因此编译器可以自动使用正确类型的运算符,具体取决于类型上下文.
那么,是否有一些具体的理由在这些语言中同时使用逻辑和按位运算符?或者他们是否因熟悉原因而被包括在内?
(我知道你可以在布尔上下文中使用"按位"运算符来规避Java和C#中的短路,但我从来没有需要这样的行为,所以我想这可能是一个大多未使用的特殊情况)
public static long checkedAdd(long a, long b) {
long result = a + b;
checkNoOverflow((a ^ b) < 0 | (a ^ result) >= 0);
return result;
}
Run Code Online (Sandbox Code Playgroud)
我感兴趣为什么布尔逻辑| 在这里使用.为什么不使用条件短路||?
正如在Java中的思维说,如果你有2个布尔对象,x并且y您可以使用x= x&&y,并x=x&y在他们身上,那么为什么它有必要,这两种类型的?
我很少碰到&和| 其他代码中的逻辑运算符代替|| 和&&.我做了一个快速的研究,因为我从来没有使用它们,也不知道它是什么.
A && B意味着如果A为假,则不会评估B并且它将返回false.
A&B表示如果A为假,即使表单也返回false,也会评估B.
当然这是与|相同的游戏 和||.
我的问题是:如果第一个成员首先确定评估,那么评估第二个成员是否有意义?我可以想象一个代码,其中第二个成员在clode中执行一些非常重要的逻辑,因此应该对其进行评估,但我怀疑这是不好的做法.是否足以使| 和&存在?
从评论中可以更清楚地说明:我觉得程序并不是最优的,而且工作得好或者更好:如果要评估所有逻辑成员,那么设计得很好.
首先,我了解到&,|,^是位运算符,现在有人提到他们与逻辑运算符&&,||,我完全糊涂了-同一个运营商有两个名字?已经有逻辑运算符&&,||,那么为什么使用&,|,^?
java ×7
operators ×3
c# ×2
c++ ×1
guava ×1
if-statement ×1
long-integer ×1
optimization ×1
performance ×1