tl; dr: существует ли не короткое замыкание логическое И в С++ (похожее на &)?
У меня есть две функции, которые я хочу вызвать, и используйте возвращаемые значения, чтобы выяснить возвращаемое значение третьей составной функции. Проблема в том, что я всегда хочу, чтобы обе функции оценивали (поскольку они выводят информацию журнала о состоянии системы)
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 С++. Из того, что я могу сказать, это работает, потому что "bool" преобразуется в int (true = 1, false = 0), а затем используется побитовый оператор, затем он преобразуется обратно в bool.
Операторы "+
" и "*
" также могут использоваться. Это не упоминается в спецификации ANSI С++, но, вероятно, работает по той же причине, что и выше. "+
" дать "или", потому что true преобразуется в 1, а затем ничего, кроме 0, преобразуется обратно в true. "*
" работает для "и", потому что 1 (true) * 0 (false) == 0 (false) и 1 (true) * 1 (true) == 1 (true)
Оба они, похоже, полагаются на неявное преобразование типа в integer, а затем обратно в bool. Оба они, вероятно, испортили бы всех, кто пытается сохранить код.
Другие ответы сводятся к "Просто использовать временные" или "Реализовать свои собственные", что не было вопросом. Цель состояла в том, чтобы увидеть, был ли уже реализован оператор, реализованный в стандарте С++.