2

次の問題が発生したとき、私はこのコードをCで書いていました。

#include <stdio.h>
int main()
{
   int i=2;
   int j=3;
   int k,l;
   float a,b;
   k=i/j*j;
   l=j/i*i;
   a=i/j*j;
   b=j/i*i;
   printf("%d %d %f %f\n",k,l,a,b);
   return 0;
}

kコードが最初と3番目の変数(および)に対してゼロを返す理由を誰かに教えてもらえますaか?

4

6 に答える 6

11

なぜkとがゼロとして表示されるのか疑問に思っていますか?これは、整数除算では2/3 = 0(小数部分は切り捨てられる)であるためです。

于 2009-10-14T19:10:21.717 に答える
7

あなたが経験しているのは整数演算です。とは2であると正しく想定lしていますが、同じ操作であるため、とは3であると誤って想定しています。しかし、そうではなく、(浮動小数点演算ではなく)整数演算です。したがって、そうするとき(空白の使用を検討してください)、2/3 = 0.33333 ...にキャストされ、したがって0になります。次に3を掛け、0 * 3=0になります。bkai / jint

あなたが変わっiてsjになるfloat(またはあなたの数学を(float)キャストでこなす)なら、これはあなたが期待することをするでしょう。

于 2009-10-14T19:13:06.180 に答える
5

あなたはあなたが何を得ているのか、あなたが何を期待しているのかを言っていませんが、この場合、おそらく推測するのは簡単です。'a = i / j * j'を実行すると、結果はおよそ.2222(つまり、2/9)になると予想されますが、代わりに0.0が得られます。これは、iとjが両方ともintであるため、乗算と(重要な)除算は整数演算で行われ、0が生成されます。結果をfloatに割り当てると、0が0.0fに変換されます。

これを修正するには、除算の前に少なくとも1つのオペランドを浮動小数点に変換します。a = (float)i/j*j);

于 2009-10-14T19:11:19.343 に答える
4

これは、cコンパイラがintを分割で処理する方法によるものです。

 #include <stdio.h>
int main()
{
int i=2;
int j=3;
int k,l;
float a,b;
k=i/j*j; // k = (2/3)*3=0*3=0
l=j/i*i; // l = (3/2)*2=1*2=2
a=i/j*j; // same as k
b=j/i*i; // same as b
printf("%d %d %f %f/n",k,l,a,b);
return 0;
}
于 2009-10-14T19:11:07.567 に答える
3

kとaが0である理由を尋ねている場合:i/j*jは。と同じ(i/j)*jです。jはiより大きいので、i/j0(整数除算)です。0*jはまだ0なので、結果(k)は0です。同じことがaの値にも当てはまります。

于 2009-10-14T19:11:03.293 に答える
0

変数がfloatであるかどうかは、使用している限り関係ありません。

整数/整数、0を取得します、

ただし、float出力を使用しているため、0.0が得られます。

于 2018-10-04T07:53:08.140 に答える