2009-10-14 8 views
1

다음과 같은 문제가 발생했을 때 C로이 코드를 작성했습니다. 코드는 첫 번째와 세 번째 변수 (ka) 제로를 반환하는 이유왜이 사업부가 0이됩니까?

#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; 
} 

사람은 말해 줄 수 있습니까?

+5

어떤 오류가 발생합니까? 결과물은 무엇입니까? 당신은 어떤 결과물을 얻고 있습니까? –

+1

은 \ n 대신/n을 사용합니다. 이것은 코드의 복사 붙여 넣기입니까, 아니면 다시 입력 했습니까? 전사 오류를 피하기 위해 복사 붙여 넣기를하는 것이 좋습니다. –

+1

제목/질문을 변경했다고 생각한 내용으로 –

답변

6

은 내가 당신이 경험하고 생각하는 정수 연산입니다 :

는 분할 전에 부동 소수점 적어도 하나의 피연산자를 변환, 그것을 해결하려면. lb이 2라고 정확하게 가정하면 동일 작업이므로 ka이 3이 될 것이라고 잘못 가정합니다. 그러나 그것은 아닙니다. 정수 연산 (부동 소수점 연산 대신)입니다. 따라서 i/j (공백을 사용하십시오) 2/3 = 0.33333 ... 을 입력하면 int이되므로 0이됩니다.

ijfloats (또는 (float) 캐스트로 뒤따를 경우)로 변경하면 예상 한대로 처리됩니다.

10

왜 k와 a가 0으로 표시되는지 묻고 있습니까? 정수 나누기 2/3 = 0 (소수 부분이 잘 리기 때문)입니다.

+0

"a = ; "a"가 float로 선언 된 경우 float로 캐스팅 된 것은 의 * 결과 *뿐입니다. 표현식의 모든 값과 변수는 정수이므로 결과는 모두 정수 산술을 기반으로합니다. – 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

이 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; 
} 
4

당신은 당신이 점점 또는 당신이 기대하지만,이 경우에는 아마 추측하기 쉬운하는지 말했다하지 않았습니다. 'a = i/j * j'를 수행하면 약 0.222 (2/9)가 될 것으로 예상되지만 대신 0.0을 얻게됩니다. 이것은 i와 j가 둘 다 정수이기 때문에 곱셈과 (결정적으로) 나눗셈은 정수 연산에서 수행되어 0을 산출합니다. float에 결과를 대입하면 0이 0.0f로 변환됩니다. a = (float)i/j*j);