Является ли (bool | bool) безопасным?
Я пишу код на С++, и я бы хотел вызвать две функции (checkXDirty
и checkYDirty
) и вернуть true
, если возвращает true
. Мне нужно оценить оба значения, даже если один возвращает true
, поэтому моя первая мысль заключалась в использовании
return checkXDirty() | checkYDirty();
Это выглядит немного странно (возможно, грязно). Это всегда приводит к правильному результату в С++? Как насчет C, с типом _Bool
? (Этот код может быть адаптирован для любого языка, и я не хочу неприятных сюрпризов при отправке кода).
Ответы
Ответ 1
Мне нужно оценить оба, даже если один возвращает true, поэтому моя первая мысль заключалась в использовании...
Тогда перестаньте пытаться быть сложным и сделать свой код подходящим как можно меньше строк. Просто вызовите обе функции и убедитесь, что их нужно вызвать:
const bool x_dirty = is_x_dirty();
const bool y_dirty = is_y_dirty();
return x_dirty || y_dirty;
Затем переименуйте или разбейте ваши функции как is_xxx_dirty
, действительно, не следует создавать побочные эффекты. В результате ваш код будет сложнее поддерживать
Ответ 2
Пока значения не являются неопределенными, технически нормально использовать побитовые операторы. Однако, поскольку это чревато проблемами как общей привычкой кодирования, я бы вместо этого просто написал небольшую встроенную OR-функцию и позволил компилятору оптимизировать. Компилятор хорош в оптимизации, поэтому пусть это.
return eitherOrBothTrue( checkXDirty(), checkYDirty() );
Или, может быть, если вы живете и решитесь взять на себя задачу объяснить код тем, кто его поддержит,
return !bothFalse( checkXDirty(), checkYDirty() );
Или теперь, когда я читаю ответ @EdS, возможно, одинаково хорошо хранить значения в переменных, но затем добавьте const
, например:
bool const xIsDirty = checkXDirty();
bool const yIsDirty = checkYDirty();
return xIsDirty || yIsDirty;