#include<stdio.h>
void main(){
int x,y,z;
x=y=z=1;
z=++x||++y&&++z;
printf("%d %d %d \n",x,y,z);
getch();
}
出力は211として表示されます!理由がわかりません...演算子の優先順位で行くと、これを説明することはできません。助けてください
#include<stdio.h>
void main(){
int x,y,z;
x=y=z=1;
z=++x||++y&&++z;
printf("%d %d %d \n",x,y,z);
getch();
}
出力は211として表示されます!理由がわかりません...演算子の優先順位で行くと、これを説明することはできません。助けてください
論理or
(||
)は、シーケンスポイントを導入します。その左側が評価されます。次に、それが0 / falseを生成した場合にのみ、右側が評価されます。
この場合、++x
は2になりますので、右側は評価されません。つまり、つまり、y
としてz
残ります1
。
||
オペレーターが短絡します。左側のオペランドが最初に評価され、ゼロ以外と評価された場合、右側のオペランドは計算されません。これにより、右オペランドの評価による副作用も防止されます。
||を使用する場合 演算子、LHSが真であることが判明した場合、最終結果は真です。したがって、++ xを実行すると、1になり、最終結果は++ x=2およびz=1&y=1になります。
ブール||
短絡。つまり、真の値が見つかると、評価を停止します。したがって、z割り当てで発生するすべてのことxが増分され、zが1に設定されます。
上記の回答の補遺:
C / C ++では、これらの演算子は短絡演算子、つまり'&&'、'||'です。および「?」(条件演算子)。
好意を持って、短絡評価に関するこの優れたwikiページをチェックしてください。記事の一般的な使用法のセクションをお見逃しなく。