2015-01-22 2 views
0

나는 다음과 같은 표현이있는 경우 :긴 표현식에서 피연산자가 어떻게 승격됩니까?

double d = floatVar/intVar; 

intVarfloat로 승진 될 것이다 다음 반환 float 결과가 double로 변환됩니다 및 d에 할당합니다.

double d = floatVar/intVar * shortVar + charVar + intVar2; 

는 모든 변수는 float로 승격되고, 다음 반환 float 결과는 double로 변환됩니다 및 d에 할당 : 그러나 같은, 나는 긴 표현이있는 경우 어떻게됩니까? 또한 나는 다음과 같은 경우

:

double d = (floatVar/intVar) * shortVar + charVar + intVar2; 

shortVarcharVarint로 변환됩니다 다음 shortVar + charVar + intVar2에서 반환 된 int 결과가 변환됩니다 동안 intVar하는 float로 변환됩니다 float을 곱하여 반환 된 float 결과를 (floatVar/intVar)과 곱하면이 결과는 float이 반환되어 double로 변환되고 d에 할당됩니까?

+0

예, 예, 예, 예, 예. – EJP

답변

2

작동 순서가 적용됩니다. /*+ 모두 왼쪽 연관 있으며 /*은 (+의보다 큰)와 동일한 우선 순위를 갖고, 따라서이 :

double b = floatVar/intVar * shortVar + charVar + intVar2; 

이 동등하다 :

double b = (((floatVar/intVar) * shortVar) + charVar) + intVar2; 

각 단계에서 적절한 전환이 수행됩니다 : float, shortVarfloat으로 변환되고, charVar은 conve float, intVar2float으로 변환됩니다. 최종 결과는 double으로 승격됩니다. 다른 한편으로는, 먼저 자리를 차지할 해당 작업을 강제로 괄호 안에 charVar + intVar2을 포장했다, 경우

은 다음 charVarchar의 범위가로, int의 범위 내에서 맞는 가정 int (승진 될 것이다 거의 모든 시스템에서 발생합니다), 결과 합계는 float으로 변환됩니다.

+0

"char가 서명 된 타입이라고 가정합니다."char "이 부호없는 타입 인 경우, 여기서 일어날 일은 무엇입니까? (charVar + intVar2)? – John

+0

@ 존 : 일반적으로 사실은 동일합니다. 다른 일이 일어나는 유일한 경우는'char'가 unsigned type *이고 범위가'int'의 범위에 맞지 않는 경우입니다. ('int'는 적어도 16 비트의 1의 보수 값의 범위를 지원해야하고'char'는 바이트의 크기가 필요합니다. 그래서 이것은 바이트가 16 인 시스템에서만 가능합니다 그래서, 희소하게 희소하다. 나는 그것이 보통보다 더 일반적이라는 것을 암시하는 것을 피하기 위해 나의 대답을 조정할 것이다.) – ruakh

관련 문제