C++의 나눗셈
이 문서는 C++의 나누기 규칙에 관한 것입니다.
먼저 나눗셈의 우선순위와 형 변환 규칙을 살펴보겠습니다. 나중에 컷오프 캐스트로 알려진 일반적인 정수 나누기 특성에 대해 논의할 것입니다.
C++의 우선 순위 및 연관성 규칙
우선 순위라는 용어는 식에서 연산자의 평가 순서를 지정합니다. 예를 들어 최상위 수준에서 최하위 수준까지 C++ 연산자에 대한 일부 우선 순위 규칙은 다음과 같습니다.
- 괄호 안의 표현식이 먼저 평가됩니다.
- 연산자
*
및\
는 동일한 우선 순위 수준을 갖습니다. - 마찬가지로
+
및-
연산자는 동일한 우선 순위 수준을 갖습니다. - 동일한 우선 순위 수준을 가진 두 연산자가 표현식에 나타나면 연산자는 왼쪽에서 오른쪽으로 평가됩니다(할당 연산자(
=
제외). 이를 연산자 결합성이라고도 합니다.
예를 들어 다음 혼합 표현식을 고려하십시오.
(1*2)+3/3*2-1
위 식은 다음과 같은 방식으로 평가됩니다.
-
첫 번째 패스에서는
*
연산자가 우선 순위가 가장 높은 괄호로 묶여 있기 때문에 먼저 평가됩니다. 첫 번째 통과 후 표현식은2+3/3*2-1
과 같이 됩니다. -
/
연산자는 두 번째 패스에서 먼저 평가됩니다.*
및/
연산자의 우선 순위 수준은 동일하지만 우선 순위 수준이 동일한 연산자는 왼쪽에서 오른쪽으로 평가됩니다.두 번째 패스 후 표현식은
2+1*2-1
과 같습니다. -
세 번째 패스에서 곱셈 연산자는 표현식의 다른 연산자 중에서 우선 순위가 가장 높기 때문에 평가됩니다. 세 번째 패스 후 표현식은
2+2-1
로 줄어듭니다. -
+
연산자는 네 번째 패스에서 먼저 평가됩니다.+
및-
연산자의 우선 순위 수준이 같더라도 우선 순위 수준이 같은 연산자는 왼쪽에서 오른쪽으로 평가됩니다.네 번째 통과 후 표현식은
4-1
이 됩니다. -
마지막으로
-
연산자가 평가되고 표현식이3
의 단일 값으로 축소됩니다.
이제 연산자 우선 순위 및 연관성에 대한 충분한 배경 지식이 있습니다. C++에서 /
연산자의 몇 가지 특성을 살펴보겠습니다.
C++의 정수 나눗셈 특성
C++에서 두 개의 정수를 나눌 때 나누기 연산자는 답의 정수 부분만 반환합니다. 답의 소수 부분은 잘립니다.
주된 이유는 컴파일러에 의한 암시적 형 변환 때문입니다. 형 변환을 시작하기 전에 정수 나눗셈의 예를 살펴보겠습니다.
#include <iostream>
using namespace std;
int main() {
int m = 10;
int n = 7;
float a = m / n;
cout << "The answer after division is:" << a << endl;
}
출력:
The answer after division is:1
출력은 C++ 컴파일러가 응답의 소수 부분을 건너뛴다는 것을 확인합니다. 이 특수성의 근본 원인과 가능한 해결책을 이해하기 위해 먼저 typecasting을 이해합시다.
C++에서 Typecast 및 Integer Division 특성 해결
Typecasting은 변수의 유형을 변경하는 것을 의미합니다. 유형 변환은 암시적이거나 명시적일 수 있습니다.
명시적 형 변환
이는 프로그래머가 명시적으로 수행합니다. 키워드 static_cast
는 명시적 유형 변환에 사용됩니다.
이러한 유형의 캐스팅은 컴파일 타임에 수행됩니다.
다음 코드는 명시적 유형 변환을 사용하여 정수 나누기 문제를 해결합니다. 아래 코드의 6행은 m
및 n
의 값을 부동 소수점 값으로 정적으로 캐스팅합니다. 따라서 나누기 결과도 부동 소수점이 됩니다.
#include <iostream>
using namespace std;
int main() {
int m = 10;
int n = 7;
float a =
static_cast<float>(m) / static_cast<float>(n); // static explicit casting
cout << "The answer after explicit typecasting is: " << a << endl;
}
출력:
The answer after explicit typecasting is: 1.42857
암시적 형변환
암시적 유형 변환은 컴파일러에서 자동으로 수행됩니다. 컴파일러는 표현식에 사용된 데이터 유형에 따라 표현식을 평가합니다.
컴파일러는 항상 주어진 표현식에 사용된 모든 데이터 유형 중에서 상위 데이터 유형의 결과를 평가합니다.
암시적 캐스팅은 정수 나누기 특성의 근본 원인입니다. 두 개의 정수 피연산자가 산술 나눗셈과 함께 사용되면 평가가 암시적으로 int 데이터 유형으로 변환되어 결과의 소수 부분이 잘립니다.
아래 코드와 같이 일부 부동 소수점 유형으로 한 나누기 피연산자의 유형을 변경하여 정수 나누기 문제를 해결할 수 있습니다.
#include <iostream>
using namespace std;
int main() {
float a = 10.0 / 7;
cout << "The answer after implicit typecasting is: " << a << endl;
}
출력:
The answer after implicit typecasting is: 1.42857
위의 예에서 분자 10.0
은 실수 값이고 분모는 정수 값입니다. float 데이터 형식이 정수 데이터 형식보다 높으므로 컴파일러는 결과 값을 float 데이터 형식으로 암시적으로 변환합니다.
Division by Zero Error 및 Division of Pointers와 같이 C++의 나눗셈 연산자와 관련된 몇 가지 다른 특징이 있습니다.