Точнее: || Оператор сначала оценит выражение на левой стороне. Если это правда, выражение с правой стороны игнорируется и все || выражение оценивается как истина. Если левое выражение ложно, правое выражение оценивается; если это правда, весь || выражение оценивает true, иначе false.
Это поведение четко определено и не тривиально. Это логическое исключение применяется ко всем логическим операторам в C ++, что допускает такие вещи, как:
if (p && *p != '\0')
Что было бы недопустимо, если бы этого правила не существовало.