다음 스 니펫에서 어떻게
int a = 7;
int b = 3;
double c = 0;
c = a / b;
c
예상대로 2.3333이 아닌 2의 값을 갖게됩니다. 경우 a
와 b
복식이다, 대답은 2.333로 전환 않습니다. 그러나 확실히 c
이미 double 이기 때문에 정수로 작업해야 했습니까?
그래서 어떻게 int/int=double
작동하지 않습니까?
답변
당신의 정수 나누기 버전을 사용하고 있기 때문이다 operator/
이 개 소요 int
들과를 반환합니다 int
. double
를 반환하는 버전 을 사용하려면 s double
중 하나 이상을 int
명시 적으로 double
.
c = a/(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
.
답변
c
은 double
변수이지만 할당되는 int
값은 두 int
s 의 나눗셈에서 발생하므로 “정수 나눗셈”(나머지 삭제)을 제공 하므로 값 입니다. 그래서 라인에서 일어나는 c=a/b
일은
a/b
평가되어 임시 유형을 만듭니다.int
- 임시 값은
c
유형으로 변환 한 후 할당됩니다double
.
의 값은 a/b
컨텍스트를 참조하지 않고 결정됩니다 (에 할당 double
).
답변
두 개의 정수를 나누면 결과는 double로 저장한다는 사실에 관계없이 정수가됩니다.
답변
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)`
이것은 할당 / 초기화의 왼쪽이 오른쪽의 동작에 영향을 미치는 하나의 컨텍스트입니다. (또한 배열 참조 초기화는 유사한 동작의 또 다른 예인 배열 유형 붕괴를 방지합니다.) 다른 모든 경우에 오른쪽은 왼쪽을 완전히 무시합니다.
답변
이 /
연산자는 정수 나눗셈 또는 부동 소수점 나눗셈에 사용할 수 있습니다. 두 개의 정수 피연산자를 제공하므로 정수 나눗셈을 수행하고 결과는 double에 저장됩니다.