2010-03-31 2 views
11

CASE2와 같은 몇 가지 계산 항목을 코딩했습니다. CASE1과 같은 코드를 리팩토링하여 정상적으로 작동합니다. CASE 2에는 암시 적 캐스트가 있지만 전체적인 이유는 확실하지 않습니다. 아래에서 정확히 무엇이 일어나는지 설명 할 수있는 사람은 누구입니까? CASE2의/2 다시 두배로 주조 5.0로 변환 int로 (5 + 6)을 주조 5 분할의 라운드를 일으키는 것을C#의 캐스팅/변환 int/double에 대한 설명

//CASE 1, result 5.5 
    double auxMedia = (5 + 6); 
    auxMedia = auxMedia/2; 

    //CASE 2, result 5.0 
    double auxMedia1 = (5 + 6)/2; 

    //CASE 3, result 5.5 
    double auxMedia3 = (5.0 + 6.0)/2.0; 

    //CASE 4, result 5.5 
    double auxMedia4 = (5 + 6)/2.0; 

제 추측이다.

사례 3과 사례 4도이 문제를 해결합니다.

+2

부수적으로, 런타임에는 단 하나의 작업 만 수행됩니다. 나머지는 모두 컴파일러에 의해 수행됩니다. –

+0

@Marc : 컴파일러는 'auxMedia'가 로컬이고 상수가 할당되어 있기 때문에 컴파일 타임에 전체적으로 case 1을 수행 할 수 없습니까? 또는 JIT에 엄격하게 적용되는 최적화입니까? –

+0

@Michael - JIT에 맡길 것을 기대합니다. 그것을 대답하기 위해 당신은 다른 컴파일러 출력물을 볼 필요가 있습니다. –

답변

13
  1. 5 + 6은 정수 11이고; 그런 다음 당신은 두 배로 배정되어 2로 나누어집니다. 5.5
  2. 5 + 6은 정수 11이고; 당신이 다음 캐스트가
  3. 5.0 + 6.0 (할당에) 두 배로 정수 10/20 = 5 정수 연산 아래는, 이중 11.0이다; 두 배로 나누기 2.0 두 번 더하기 5.5
  4. 5 + 6은 정수 11; 분할 11.0 배로 암시 캐스트가 다음 번 5.5
+0

마크가 정확합니다. 두 번째 라인이'auxMedia = auxMedia/2.0'이라면'2.0 '은 double로 읽히고'2'는 int로 읽히므로 기대 한 결과를 얻을 수 있습니다 (10 진수를 버립니다. 심지어 라운드). – Jaxidian

1
//CASE 2, result 5.0 
double auxMedia1 = (5 + 6)/2; 

께 (5 + 6) 연산의 결과를주는 두 2.0 나누는 정수이다. 왜냐하면 두 피연산자 모두 정수형이기 때문입니다. 그런 다음 컴파일러는 11/2를 수행합니다. 두 피연산자는 모두 정수입니다. 마지막 나누기의 결과는 분명히 5입니다. 정수 나누기 (적절한 영어 단어를 모르는 경우)입니다.

1

정확합니다. 사례 2는 할당이 이루어질 때까지 정수 산술을 사용합니다. 또한 명시 적 캐스트를함으로써 문제를 해결할 수 : 소수점으로 숫자를 double로 해석되는 반면

double auxMedia1 = ((double) (5 + 6))/2; 
5

이 마크의 (올바른)을 확장 조금 대답하기 위해, 정수는 정수로 해석됩니다. 전체 숫자를 리터럴 더블로 선언하려면 "D"를 덧붙입니다.

 //CASE 2b, result 5.5 
     double auxMedia2b = (5D + 6D)/2;