このコードを実行してみました:
int x = 0;
double y = 1/2;
if (y <= x || y/x < 1)
y++;
printf("%.2f", y);
出力は1.00
です。これは私にはちょっと驚きです。(y <= x)
最初の式は falseだと思いました。これは||
演算子なので、C は(y/x < 1)
ゼロによる除算を含む 2 番目の式も評価する必要があります。しかし、なぜエラーが表示されないのでしょうか?
このコードを実行してみました:
int x = 0;
double y = 1/2;
if (y <= x || y/x < 1)
y++;
printf("%.2f", y);
出力は1.00
です。これは私にはちょっと驚きです。(y <= x)
最初の式は falseだと思いました。これは||
演算子なので、C は(y/x < 1)
ゼロによる除算を含む 2 番目の式も評価する必要があります。しかし、なぜエラーが表示されないのでしょうか?
y
実際には 0 です:
double y = 1/2;
上記は整数除算を行うため、結果は 0 になります。必要なものは次のとおりです。
double y = 1.0/2.0;
代入double y = 1/2;
は に対して 0 を返しますy
。つまり、||
is ショートカットです (つまり、 or の 2 番目の部分は評価されません)。
y を 0.5 にする場合は、次のように記述します。
double y = 1/2.0;
まず、他の誰もが指摘したように、1/2
は 2 つの整数による除算であるため、y にゼロを割り当てます。
あなたの - 間違った - 例では、1 と 2 が整数であり、y が 0 に割り当てられます。「最初の式(y <= x)
は false」という仮定は明らかに正しくなくy
、x
両方ともゼロであり、したがって等しいです。式は短絡され、2 番目の部分は評価されません (0 による除算はありません)。
ゼロで除算しても、エラーが発生する保証はありません。たとえば、IEEE 754では、0 で除算すると無限大になると規定されています。