2009-10-14 3 views
1

Я писал этот код на 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 и a)?

+5

Какие ошибки вы получаете? Что вы ожидаете от вывода? Какой результат вы получаете? –

+1

обратите внимание, что у вас есть/n вместо \ n. Является ли это копией вашего кода или вы его повторно набрали? Лучше иметь копию-вставку, чтобы избежать ошибок транскрипции. –

+1

Я изменил заголовок/вопрос на то, что, как я думаю, было предназначено –

ответ

6

То, что я думаю, что вы испытываете целочисленная арифметика. Вы правильно полагаете, что l и b должны быть 2, но неправильно предположите, что k и a будут 3, потому что это та же операция. Но это не так, это целочисленная арифметика (а не арифметика с плавающей запятой). Поэтому, когда вы делаете i/j (пожалуйста, рассмотрите возможность использования некоторых пробелов), 2/3 = 0,333333 ... , который отливается до int и, таким образом, становится 0. Затем умножим на 3 и 0 * 3 = 0.

Если вы измените i и j будет float s (или перепишите свою математику с помощью (float) призов), это будет делать то, что вы ожидаете.

10

Вы спрашиваете, почему k и какое-то новшество? Это происходит потому, что в целых делениях 2/3 = 0 (дробная часть усечена).

+0

Расширяя это, когда вы пишете «a = ;» с «a» объявленным поплавком, это только * результат * , который вызывается для поплавка. Поскольку все значения и переменные в ваших выражениях являются целыми, все результаты основаны на целочисленной арифметике. – Steve314

+0

Это также относится к тому, что он выполняет ту же операцию там (i/j == (int) 2/(int) 3 == 0) –

2

Если вы спрашиваете, почему k и a равны 0: i/j*j - это то же самое, что и (i/j)*j. Поскольку j больше i, i/j равно 0 (целочисленное деление). 0*j по-прежнему 0, поэтому результат (k) равен 0. То же самое относится к значению a.

3

это связано с тем, как компилятор обрабатывает с 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; 
} 
4

Вы не сказали, что вы получаете, или то, что вы ожидаете, но в данном случае это, вероятно, легко догадаться. Когда вы делаете «a = i/j * j», вы ожидаете, что результат будет примерно 0,2222 (т. Е. 2/9), но вместо этого вы получаете 0.0. Это связано с тем, что i и j являются как int, так и умножением и (решающим) делением выполняются в целочисленной математике, что дает 0. Вы присваиваете результат float, так что 0 затем преобразуется в 0.0f.

Чтобы это исправить, конвертировать по крайней мере, один операнд с плавающей точкой ДО деления: a = (float)i/j*j);

Смежные вопросы