tl; dr: Есть ли в C ++ логическое AND без короткого замыкания (аналогично &&)?
У меня есть 2 функции, которые я хочу вызвать, и использую возвращаемые значения, чтобы выяснить значение возврата 3-й составной функции. Проблема в том, что я всегда хочу, чтобы обе функции оценивали (так как они выводят в журнал информацию о состоянии системы)
IE:
bool Func1(int x, int y){
if( x > y){
cout << "ERROR- X > Y" << endl;
}
}
bool Func2(int z, int q){
if( q * 3 < z){
cout << "ERROR- Q < Z/3" << endl;
}
}
bool Func3(int x, int y, int z, int q){
return ( Func1(x, y) && Func2(z, q) );
}
Конечно, условия не так просты в функциях, и да, я понимаю, что мог бы использовать временные переменные для хранения результатов двух функций, а затем выполнить логику «короткого замыкания» для временного переменные, но мне было интересно, было ли «элегантное» языковое решение для сохранения возврата в одну строку в Func3, в то же время получая сообщения регистрации из обеих функций.
Сводка ответов:
«Побитовые» операторы | и & может использоваться для получения эффекта, но только если тип возвращаемого значения - bool. Я не нашел упоминания об этом в спецификации ANSI C ++. Из того, что я могу сказать, это работает, потому что "bool" конвертируется в int (true = 1, false = 0), а затем используется побитовый оператор, затем он конвертируется обратно в bool.
Операторы "+
" и "*
" также могут быть использованы. Это не упоминается в спецификации ANSI C ++, но, вероятно, работает по той же причине, что и выше. "+
" give "или" потому что true преобразуется в 1, а затем все, кроме 0, преобразуется обратно в true. «*
» работает для «и», потому что 1 (true) * 0 (false) == 0 (false) и 1 (true) * 1 (true) == 1 (true)
Кажется, что оба они полагаются на неявное преобразование типа в целое, а затем обратно в bool. Оба из них, вероятно, испортят любого, кто пытается сохранить код.
Другие ответы сводятся к "Просто используйте временные" или "Реализуйте свои собственные", который не был вопросом. Цель состояла в том, чтобы увидеть, существует ли уже оператор, реализованный в стандарте C ++ для этого.