Cの論理演算子は短絡に従うことを知っていますが、私の疑いは、短絡と演算子の優先規則が互いに対立していないことです。以下の例を参照してください。
#include<stdio.h>
int main()
{
int a;
int b=5;
a=0 && --b;
printf("%d %d",a,b);
return 0;
}
優先規則によれば、最高の優先順位は前置演算子です。したがって、--b
が最初に評価され、次に&&
が評価され、最後にa
に結果が割り当てられます。したがって、予想される出力は0 4
になります。ただし、この場合、&&
の2番目のオペランドは実際には実行されず、結果は0 5
になります。
ここで優先ルールが適用されない理由。論理演算子は優先ルールから除外されていますか?はいの場合、他のどのようなオペレーターがそのような動作を示していますか?そして、この振る舞いの背後にある論理は何ですか?
_operator &&
_の評価順序は左から右です。
_=
_は優先順位が低く、実際には_ooperator ,
_だけが_=
_より優先順位が低くなっています。
したがって、式は、評価の順序が最初に与えられた場合、最初に評価されたa = (0 && --b)
を読み取ります。
_0
_はfalse
に評価されるため、式の最初の部分がfalse
である場合、_false && true
_はfalse
であるため、式の2番目の部分を評価する必要はありません。式は常にfalse
になります。
_||
_演算子がある場合、式の2番目の部分を評価する必要があります。
演算子の優先順位は、必ずしも式が最初に実行されるとは限りません。つまり、式が解析されて、優先順位の高い演算の結果が優先順位の低い演算で使用され、その逆は行われません。実際の式は、必要な場合にのみ評価されます。