Это очень подробный вопрос о логических операторах ||, && на C++. Я использую их в своем коде, но я сомневаюсь в этом коде:
bool filluppointer(int*sth);
if (filluppointer(&pointer) || filluppointer2(&pointer))
return;
filluppointer возвращает true, если что-то произошло, поэтому не всегда. Мой вопрос: если первая функция вернет true, будет ли выполняться вторая функция в блоке if? || равен оператору OR, поэтому согласно спецификации обе функции выполняются последовательно, а затем сравниваются bools. Я просто хочу создать такую структуру, которая возвращается всей if if, когда встречается первая истинная функция, и очень важно остановиться тогда, так как я хочу, чтобы это конкретное значение в указателе. Выполнение другой функции впоследствии изменит значение (не здесь, а в моем реальном коде).
Мой вопрос: если первая функция вернет true, будет ли выполняться вторая функция в блоке if?
Нет.
C++ использует оценку короткого замыкания для &&
и ||
,
&&
и ||
, не для других операторов. Для &
и |
, если оба типа операндов - bool
, это было бы возможно одинаково. Было бы даже возможно для чего-то вроде &
или даже *
на целых числах, если известно, что первый операнд равен нулю. Но это не так, как работает C ++.
Стандарт C++ ГАРАНТИИ, что выражение оценивается слева направо и что, как только выражение может быть известно, дальнейшая оценка не выполняется. Это особенно удобно для таких вещей, как:
if (ptr != NULL && ptr->x > 12) ...
или
if (x != 0 && y / x > 0) ...
или даже это должно работать:
if (ptr == NULL || ptr->x > 12)
Все вышеперечисленное недействительно, если оценка будет выполнена "полностью".