2 つの関数a()
とがありb()
、どちらもブール値を返します。結果がわかるとすぐに論理式の評価が停止されることは知っていますが、2 つ以上の関数に対して両方の関数が実行されるような方法で論理演算を実行する方法はありますか?
4 に答える
論理式の評価は、結果が判明するとすぐに停止されます。これを望まない場合は、and 演算子を min() に、or 演算子を max() に置き換えることができます。
したがって、このコードは役に立つかもしれません。すべての関数がそれぞれの場合に呼び出されることがわかります。はい、これを 2 つ以上の関数で使用できます。
function a()
{
echo "function a<br/>\n";
return true;
}
function b()
{
echo "function b<br/>\n";
return false;
}
function c()
{
echo "function c<br/>\n";
return false;
}
echo min(a(), b(), c());
echo "<br/>";
echo max(a(), b(), c());
echo "<br/>";
出力:-
function a
function b
function c
(false)
function a
function b
function c
(true)
必要なものによっては、これが可能になる場合があります(@ JakobPogulisの回答に従って):
PHP:
function a() {
print("A");
return true;
}
function b() {
print("B");
return false;
}
var_dump((boolean)(intval(a()) | intval(b())));
var_dump((boolean)(intval(a()) & intval(b())));
JavaScript:
function a()
{
console.log("A");
return true;
}
function b()
{
console.log("B");
return false;
}
console.log(Boolean(Number(a()) & Number(b())));
console.log(Boolean(Number(a()) | Number(b())));
両方の関数を実行する必要がある場合、単一のステートメントでこの動作を保証することはできません。最初は、連言または選言を使用できると思うかもしれませんが、これらの構文はどちらも遅延型です。つまり、true (選言) または false (連言) であることが判明するとすぐに評価を停止します。
function a() {
print("A");
return true;
}
function b() {
print("B");
return false;
}
$disjunction = a() || b(); // prints A, not B
$conjunction = b() && a(); // prints B, not A
上記のコードは のみを出力AB
し、期待どおりにはなりませABBA
ん。これは、一方の値が真の場合、論理和は常に真になり、一方の値が偽の場合、論理積は常に偽になるためです。
添加
何らかの理由でこの動作が本当に必要な場合、PHP 関数はmap
,reduce
のようfilter
に使用して、いくつかのステートメントを評価し、単一のブール値の答えになる可能性があります。ただし、これには評価をサポートする追加の関数を作成する必要があり (create_function
関数で使用できます)、複数行を使用する場合ほど読みにくくなり、そうなるとデバッグがはるかに難しくなります。
以下のようなことですか?
var bothTrue;
if(a() && b()) {
bothTrue = true;
}
else {
bothTrue = false;
}
または、「代替」とは具体的に何を意味しますか?