Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Использование побитовых операторов для булевых чисел в C++
Есть ли какая-либо причина не использовать побитовые операторы &, |, и ^ для значений "bool" в C++?
Я иногда сталкиваюсь с ситуациями, когда я хочу, чтобы одно из двух условий было истинным (XOR), поэтому я просто бросаю оператор ^ в условное выражение. Я также иногда хочу, чтобы все части условия были оценены, является ли результат истинным или нет (вместо короткого замыкания), поэтому я использую & и |. Мне также иногда нужно накапливать логические значения, и &= и |= могут быть весьма полезны.
Я получил несколько поднятых бровей, когда делал это, но код все еще значим и чище, чем это было бы в противном случае. Есть ли какая-то причина NOT использовать их для bools? Есть ли современные компиляторы, которые дают плохие результаты для этого?
|| и && являются логическими операторами, и встроенные из них гарантированно возвращают либо true , либо false . Больше ничего.
|, & и ^ являются побитовыми операторами. Когда область чисел, с которой вы работаете, просто 1 и 0, то они точно такие же, но в тех случаях, когда ваши булевы не являются строго 1 и 0 –, как в случае с языком C –, вы можете в конечном итоге получить какое-то поведение, которого вы не хотели. Например:
BOOL two = 2;
BOOL one = 1;
BOOL and = two & one; //and = 0
BOOL cand = two && one; //cand = 1
В C++, однако, тип bool гарантированно будет только либо true , либо false (которые неявно преобразуются соответственно в 1 и 0 ), так что это меньше беспокоит с этой позиции, но тот факт, что люди не привыкли видеть такие вещи в коде, является хорошим аргументом для того, чтобы не делать этого. Просто скажите b = b && x и покончите с этим.
Две основные причины. Короче говоря, подумайте хорошенько; для этого может быть хорошая причина, но если в ваших комментариях есть явное выражение be VERY, потому что оно может быть хрупким и, как вы сами говорите, люди обычно не привыкли видеть такой код.
Побитовый xor != Логическое xor (кроме 0 и 1)
Во-первых, если вы оперируете значениями , отличными от false и true (или 0 и 1, как целые числа), оператор ^ может ввести поведение, не эквивалентное логическому xor. Например:
int one = 1;
int two = 2;
// bitwise xor
if (one ^ two)
{
// executes because expression = 3 and any non-zero integer evaluates to true
}
// logical xor; more correctly would be coded as
// if (bool(one) != bool(two))
// but spelled out to be explicit in the context of the problem
if ((one && !two) || (!one && two))
{
// does not execute b/c expression = ((true && false) || (false && true))
// which evaluates to false
}
Кредит пользователю @Patrick для выражения этого в первую очередь.
Порядок операций
Во-вторых, | , & и ^ , как побитовые операторы, не имеют короткого замыкания. Кроме того, несколько побитовых операторов, связанных вместе в одном операторе-даже с явными скобками-могут быть переупорядочены оптимизирующими компиляторами, поскольку все 3 операции обычно коммутативны. Это важно, если важен порядок операций.
Иначе говоря
bool result = true;
result = result && a() && b();
// will not call a() if result false, will not call b() if result or a() false
не всегда будет давать тот же результат (или конечное состояние), что и
bool result = true;
result &= (a() & b());
// a() and b() both will be called, but not necessarily in that order in an
// optimizing compiler
Это особенно важно, потому что вы можете не контролировать методы a() и b() , или кто-то другой может прийти и изменить их позже, не понимая зависимости, и вызвать неприятную (и часто только выпускающую сборку) ошибку.
Поднятые брови должны сказать вам достаточно, чтобы прекратить это делать. Вы не пишете код для компилятора, вы пишете его сначала для своих коллег-программистов, а затем для компилятора. Даже если компиляторы работают, удивлять других людей-это не то, что вам нужно, - побитовые операторы предназначены для битовых операций, а не для булов.
Я полагаю, вы также едите яблоки с fork? Это работает, но удивляет людей, поэтому лучше этого не делать.