* И + эквивалентны соответственно & amp; & amp; и || на булевых операндах?

[8] является массивом логических значений. Я пытаюсь вычислить логическое выражение, похожее на следующее.

bool a[8];
.....
bool result=a[0]*(a[3]+a[6]*(a[4]+a[7]*a[5]))+a[1]*(a[6]*a[3]+a[4]+a[7]*a[5])+a[2]*(a[5]+a[7]*(a[4]+a[6]*a[3]));

Выражение длинное, но концептуально ничего сложного. Единственная ошибка, кажется, результат отличается, когда я заменяю * в выражении на && (в обоих случаях я ожидаю логическое И) или заменить + на || (ожидая логического ИЛИ).

Я не уверен, какие из них были бы правильными, булевы операторы или математические обозначения умножения, сложения и т. Д. Хуже того, ни один из них не дает никакой ошибки, то есть компилятор доволен обоими. Какой из них более безопасный и правильный?

2

Решение

Они есть почти то же самое для bool операнды. Но есть небольшие различия:

  1. * а также + расширит bool введите аргументы для int типы.

  2. Тип выражения a || b является bool, в то время как a + b является int, То же самое для && а также *,

  3. * а также + не являются точками последовательности, тогда как && а также || являются.

  4. * а также + не закорочены, тогда как && а также || являются.

  5. Они занимают очень разные позиции в таблице приоритетов операторов. Таким образом, замена не является простой.

  6. Если a это bool, а также b также bool но не инициализируется, то поведение a || b определяется, но a + b является не определено с bool Можно содержать представление ловушек в C ++. Подобные выражения могут быть вызваны для && а также *,

  7. Очень длинная цепочка a + b + c + ... может переполнить int тип, поведение которого не определено.

(3) означает, что a++ * a++ неопределенное поведение, но a++ || a++ не является.

(Не очень актуально здесь, но стоит отметить: обратите внимание, что && а также || потерять свойство короткого замыкания, если они перегружены).

8

Другие решения

В дополнение к короткому замыканию в логических операторах, которое здесь не имеет значения, принципиальное отличие для объяснения изменений в поведении приоритет оператора.

Когда вы заменяете * с &&, или же + с ||, порядок старшинства меняется: * имеет выше приоритет чем +, но && имеет ниже приоритет чем +, Вот почему вам нужно полностью заключить в скобки ваше выражение, чтобы заставить желаемый порядок операций только с * заменен на &&,

Замена обоих * а также + с && а также || относительный приоритет этих двух операторов будет одинаковым, поэтому вы получите одинаковый результат.

5

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector