0

このコードを実行してみました:

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 番目の式も評価する必要があります。しかし、なぜエラーが表示されないのでしょうか?

4

4 に答える 4

5

y実際には 0 です:

double y = 1/2;

上記は整数除算を行うため、結果は 0 になります。必要なものは次のとおりです。

double y = 1.0/2.0;
于 2013-02-23T12:46:45.190 に答える
3

代入double y = 1/2;は に対して 0 を返しますy。つまり、||is ショートカットです (つまり、 or の 2 番目の部分は評価されません)。

y を 0.5 にする場合は、次のように記述します。

double y = 1/2.0;
于 2013-02-23T12:46:10.270 に答える
0

まず、他の誰もが指摘したように、1/2は 2 つの整数による除算であるため、y にゼロを割り当てます。

あなたの - 間違った - 例では、1 と 2 が整数であり、y が 0 に割り当てられます。「最初の式(y <= x)は false」という仮定は明らかに正しくなくyx両方ともゼロであり、したがって等しいです。式は短絡され、2 番目の部分は評価されません (0 による除算はありません)。

ゼロで除算しても、エラーが発生する保証はありません。たとえば、IEEE 754では、0 で除算すると無限大になると規定されています。

于 2013-02-23T13:03:58.470 に答える