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]));
Выражение длинное, но концептуально ничего сложного. Единственная ошибка, кажется, результат отличается, когда я заменяю * в выражении на && (в обоих случаях я ожидаю логическое И) или заменить + на || (ожидая логического ИЛИ).
Я не уверен, какие из них были бы правильными, булевы операторы или математические обозначения умножения, сложения и т. Д. Хуже того, ни один из них не дает никакой ошибки, то есть компилятор доволен обоими. Какой из них более безопасный и правильный?
Они есть почти то же самое для bool
операнды. Но есть небольшие различия:
*
а также +
расширит bool
введите аргументы для int
типы.
Тип выражения a || b
является bool
, в то время как a + b
является int
, То же самое для &&
а также *
,
*
а также +
не являются точками последовательности, тогда как &&
а также ||
являются.
*
а также +
не закорочены, тогда как &&
а также ||
являются.
Они занимают очень разные позиции в таблице приоритетов операторов. Таким образом, замена не является простой.
Если a
это bool
, а также b
также bool
но не инициализируется, то поведение a || b
определяется, но a + b
является не определено с bool
Можно содержать представление ловушек в C ++. Подобные выражения могут быть вызваны для &&
а также *
,
Очень длинная цепочка a + b + c + ...
может переполнить int
тип, поведение которого не определено.
(3) означает, что a++ * a++
неопределенное поведение, но a++ || a++
не является.
(Не очень актуально здесь, но стоит отметить: обратите внимание, что &&
а также ||
потерять свойство короткого замыкания, если они перегружены).
В дополнение к короткому замыканию в логических операторах, которое здесь не имеет значения, принципиальное отличие для объяснения изменений в поведении приоритет оператора.
Когда вы заменяете *
с &&
, или же +
с ||
, порядок старшинства меняется: *
имеет выше приоритет чем +
, но &&
имеет ниже приоритет чем +
, Вот почему вам нужно полностью заключить в скобки ваше выражение, чтобы заставить желаемый порядок операций только с *
заменен на &&
,
Замена обоих *
а также +
с &&
а также ||
относительный приоритет этих двух операторов будет одинаковым, поэтому вы получите одинаковый результат.