Подтвердить что ты не робот

Является ли (bool | bool) безопасным?

Я пишу код на С++, и я бы хотел вызвать две функции (checkXDirty и checkYDirty) и вернуть true, если возвращает true. Мне нужно оценить оба значения, даже если один возвращает true, поэтому моя первая мысль заключалась в использовании

return checkXDirty() | checkYDirty();

Это выглядит немного странно (возможно, грязно). Это всегда приводит к правильному результату в С++? Как насчет C, с типом _Bool? (Этот код может быть адаптирован для любого языка, и я не хочу неприятных сюрпризов при отправке кода).

4b9b3361

Ответ 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;