Учитывая функцию вывода, которая всегда возвращает true
:
bool print( const char* msg )
{
puts( msg ) ;
return true ;
}
Затем вы можете использовать оценку короткого замыкания следующим образом:
bool sum = AsciiSum(name)>=20;
bool len = NameLength(name)<6;
(sum && print("playerA")) ||
(len && print("playerB")) ||
print("no player was sent") ;
Тестирование всех комбинаций таким образом:
bool sum = false, len = false ;
(sum && print("playerA")) || (len && print("playerB")) || print("no player was sent") ;
sum = false, len = true ;
(sum && print("playerA")) || (len && print("playerB")) || print("no player was sent") ;
sum = true, len = false ;
(sum && print("playerA")) || (len && print("playerB")) || print("no player was sent") ;
sum = true, len = true ;
(sum && print("playerA")) || (len && print("playerB")) || print("no player was sent") ;
правильно выводит:
no player was sent
playerB
playerA
playerA
Ваш компилятор может выдать диагностику относительно результата использования неиспользуемого выражения;это может быть подавлено фиктивным присваиванием:
bool dummy = (sum && print("playerA")) ||
(len && print("playerB")) ||
print("no player was sent") ;
или преобразованием целого выражения в void:
(void)((sum && print("playerA")) ||
(len && print("playerB")) ||
print("no player was sent")) ;
Единственное требование функции вывода - это то, что она возвращаетнулевое значение для короткого замыкания ||
, с этой целью printf()
будет работать, если сообщение не является пустой строкой, и избегать необходимости определять конкретную функцию вывода .:
(void)((sum && printf("playerA\n")) ||
(len && printf("playerB\n")) ||
printf("no player was sent\n")) ;
puts()
однако гарантирует только возврат неотрицательного значения в случае успеха, которое включает ноль, поэтому не должно использоваться.