tl; dr:C ++に非短絡論理積がありますか(&&と同様)?
呼び出したい関数が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) );
}
もちろん、関数の条件はそれほど単純ではありません。そうです、一時変数を使用して2つの関数の戻り値を格納し、一時変数に対して「短絡」ロジックを実行できることに気付きましたが、両方の関数からログメッセージを取得しながら、Func3で1行の戻り値を維持するための、「エレガントな」言語ソリューションがあるかどうか疑問に思いました。
回答の概要:
「ビットごとの」演算子| および&を使用して効果を得ることができますが、returnタイプがboolの場合に限ります。ANSIC++仕様ではこれについての言及は見つかりませんでした。私の知る限り、これは「bool」がint(true = 1、false = 0)に変換され、次にビット演算子が使用されてから、boolに変換されるために機能します。
演算子「+
」および「*
」も使用できます。これはANSIC++仕様には記載されていませんが、おそらく上記と同じ理由で機能します。+
trueは1に変換され、0以外はtrueに変換されるため、 ""give"または" 。*
1(true)* 0(false)== 0(false)および1(true)* 1(true)== 1(true)であるため、""は"および"に対して機能します
これらは両方とも、整数への暗黙の型変換に依存しているようで、その後ブール値に戻ります。これらは両方とも、コードを維持しようとする人を台無しにする可能性があります。
他の回答は、「一時的なものを使用する」または「独自に実装する」に要約されますが、これは問題ではありませんでした。目標は、それを実行するためにC++標準に実装されたオペレーターがすでに存在するかどうかを確認することでした。