답변:
당신의 정수 나누기 버전을 사용하고 있기 때문이다 operator/
이 개 소요 int
들과를 반환합니다 int
. double
를 반환하는 버전 을 사용하려면 s double
중 하나 이상을 int
명시 적으로 double
.
c = a/(double)b;
a
및 로 변환하는 것을 선호 하지만 실제로는 중요하지 않습니다. b
double
static_cast<>
항상 나에게 긴 바람처럼 보였다. 프리미티브의 경우 static_cast<>
, reinterpret_cast<>
혼동 될 위험이 전혀 없습니다 .
static_cast
이 경우 피하고 대신 C 스타일 캐스트를 사용하는 것이 좋습니다. 여기에서 C ++ 스타일 캐스트를 사용하는 것에는 이점이 없으며 C 스타일 캐스트보다 코드를 훨씬 더 복잡하게 만듭니다. 산술 캐스트는 C 스타일 캐스트가 완벽하게 적절하고 실제로 다른 캐스트보다 더 적절한 컨텍스트입니다.
double(b)
. 명시 적 생성자 호출과 동일 해 보이기 때문에 항상 변환이라는 것을 인식하지는 않습니다.
여기있어:
a) 둘로 나누기 int
s를 항상 정수 나누기가 수행됩니다. 따라서 a/b
귀하의 경우 결과 는 int
.
유지하려는 경우 a
와 b
같이 int
완전히 그들을의, 아직 분할, 당신은 두 배로 그들 중 적어도 하나에 캐스팅해야합니다 (double)a/b
또는a/(double)b
또는 (double)a/(double)b
.
b) c
A는 double
그것을 수 있도록 허용int
assignement의 값을 다음은int
자동으로 변환된다 double
및 할당 c
.
c) 할당시의 오른쪽에있는 표현식 =
이 먼저 계산 된 다음 (위의 규칙 (a)에 따라 왼쪽에있는 변수에 관계없이 =
) 다음=
(에 따라) 의 왼쪽에있는 변수에 할당됩니다. b) 위). 나는 이것이 그림을 완성한다고 믿는다.
아주 적은 예외 (하나만 생각할 수 있음)를 제외하고 C ++는 표현식 자체에서 표현식 (또는 하위 표현식)의 전체 의미를 결정합니다. 표현의 결과로 무엇을하든 상관 없습니다. 귀하의 경우에는 표현 a / b
에서 a double
가 보이지 않습니다 . 모든 것이입니다 int
. 따라서 컴파일러는 정수 나누기를 사용합니다. 결과를 얻은 후에 만 무엇을할지 고려하고 double
.
&funcname
어떤 유형으로 캐스팅 하느냐에 따라 다릅니다.
C ++ 언어에서 subexpresison의 결과는 주변 컨텍스트의 영향을받지 않습니다 (일부 예외가 있음). 이것은 언어가주의 깊게 따르는 원칙 중 하나입니다. 표현식 c = a / b
에는 a / b
해당 하위 표현식 외부의 모든 항목과 독립적으로 해석되는 독립 하위 표현식이 포함됩니다. 언어는 나중에 결과를 double
.a / b
정수 나눗셈입니다. 다른 것은 중요하지 않습니다. 이 원칙은 언어 사양의 많은 부분에서 따를 것입니다. 이것이 C ++ (및 C)가 작동하는 방식을 결정합니다.
위에서 언급 한 예외의 한 예는 함수 오버로딩이있는 상황에서 함수 포인터 할당 / 초기화입니다.
void foo(int);
void foo(double);
void (*p)(double) = &foo; // automatically selects `foo(fouble)`
이것은 할당 / 초기화의 왼쪽이 오른쪽의 동작에 영향을 미치는 하나의 컨텍스트입니다. (또한 배열 참조 초기화는 유사한 동작의 또 다른 예인 배열 유형 붕괴를 방지합니다.) 다른 모든 경우에 오른쪽은 왼쪽을 완전히 무시합니다.
이것은 기술적으로 언어에 따라 다르지만 거의 모든 언어가이 주제를 동일하게 취급합니다. 표현식의 두 데이터 유형간에 유형 불일치가있는 경우 대부분의 언어는 데이터를=
사전 정의 된 규칙 세트에 따라의 한쪽에있는 데이터를 다른쪽에있는 데이터와 일치 .
동일한 유형 (정수, 이중 등)의 두 숫자를 나눌 때 결과는 항상 동일한 유형이됩니다 (따라서 'int / int'는 항상 int가됩니다).
이 경우
분수 데이터가 이미 손실 된 경우 계산 후double var = integer result
정수 결과를 double로 캐스팅합니다 . (대부분의 언어는 예외 나 오류를 발생시키지 않고 유형 부정확성을 방지하기 위해이 캐스팅을 수행합니다.)
결과를 두 배로 유지하려면 다음과 같은 상황을 만들고 싶을 것입니다.
double var = double result
이를 수행하는 가장 쉬운 방법은 방정식의 오른쪽에있는 표현식을 강제로 이중으로 변환하는 것입니다.
c = a/(double)b
정수와 double을 나누면 정수가 double로 캐스트됩니다 (수학을 수행 할 때 컴파일러는 종종 데이터 손실을 방지하기 위해 가장 특정한 데이터 유형으로 "업 캐스트"됩니다).
업 캐스트 후에는 a
더블로 마무리되고 이제 두 더블 사이의 분할이 있습니다. 그러면 원하는 부서와 할당이 생성됩니다.
다시 말하지만, 이것은 언어에 따라 다르지만 (컴파일러에 한정 될 수도 있음) 거의 모든 언어 (확실히 내가 생각할 수있는 모든 언어)가이 예제를 동일하게 취급합니다.
중요한 것은 계산 요소 중 하나가 float-double 유형이라는 것입니다. 그런 다음 이중 결과를 얻으려면이 요소를 아래와 같이 캐스팅해야합니다.
c = static_cast<double>(a) / b;
또는 c = a / static_cast (b);
또는 직접 만들 수 있습니다.
c = 7.0 / 3;
계산 요소 중 하나는 float-double 유형을 정수로 나눈 것을 나타 내기 위해 '.0'을 가져야합니다. 그렇지 않으면 c 변수가 double이지만 결과도 0이됩니다.