관리자 글쓰기
C++ 식과 연산자2
2022. 3. 6. 12:21 - pingu-s

연산자의 우선순위

 

연산자의 우선순위

 

a + 3 * 9 //3 * 9가 우선 평가된다

우선순위에 의해 상기의 코드에서는 [3 * 9]가 평가되므로 [a + 27]이 된다.

 

연산자의 우선순위는 변경할 수도 있다. 통상의 수식과 똑같이 괄호를 사용해서 괄호 내를 우선적으로 평가하는 것이다.

(a + 3) * 9

위 식에는 [a + 3]이 우선 평가되고 그 값에 9를 곱하게 된다.

 

a = b + 3;

대입 연산자와 같은 연산자는 사칙 연산보다도 우선순위가 낮기 때문에 상기의 식은 다음의 식과 똑같은 순서로 연산된다.

a = (b + 3); //b + 3이 우선 평가된다

 

같은 우선순위의 연산자 사용

 

같은 레벨의 우선순위 연산자가 동시에 사용된 경우 [왼쪽부터 순서대로] 계산하는 규칙으로 되어 있다. 이와 같은 연산의 순서를 왼쪽 결합(left associative)이라고 한다.

a + b + 1

로 기술했을 때에는

(a + b) + 1

라는 순서로 평가되는 것이다.

 

역으로 오른쪽부터 평가되는 연산자도 있는데 이것을 오른쪽 결합(right associative)이라고 한다. 예를 들면, 대입 연산자는 오른쪽 결합 연산자이다.

a = b = 1

로 기술했을 때에는

a = (b = 1)

라는 순서로 오른쪽부터 평가되기 때문에 우선 변수 b에 1이 대입되고 계속해서 a에도 1의 값이 대입된다. 일반적으로 단항 연산자대입 연산자는 오른쪽 결합 연산자이다.

 

형 변환

 

큰 사이즈의 형에 대입

 

예제) 큰 사이즈의 형에 대입

double형의 변수에 int형의 값을 저장하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

int main()
{
	int inum = 180;
	double dnum;

	cout << "신장은 " << inum << "센티미터이다.\n";
	cout << "double형의 변수에 대입한다.\n";

	dnum = inum;
	/*큰 사이즈의 형에 대입한다. 이 코드에서는 int형의 변수의 값을 double형의 변수에
	대입한다. 그러면 int형의 값은 double형으로 변환되어 대입되는 것이다.*/
	cout << "신장은 " << dnum << "센티미터이다.\n";

	return 0;
}

일반적으로 C++에서는 큰 사이즈의 형의 변수에 작은 사이즈의 형의 값을 대입하는 것이 가능하다. 이와 같이 형이 변환되는 것형 변환이라 한다.

 

작은 사이즈의 형에 대입

 

역으로 작은 사이즈의 형에 큰 사이즈의 형의 값을 대입하는 경우(int형에서 double형의 대입)를 살펴보도록 한다.

 

예제) 작은 사이즈의 형에 대입

double형의 변수에 저장된 값은 int형의 변수에 저장하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

int main()
{
	double dnum = 180.5;
	int inum;

	cout << "신장은 " << dnum << "센티미터이다.\n";
	cout << "int형의 변수에 대입한다.\n";

	inum = dnum;
	//double형의 값이 int형으로 변환되어 대입된다.
	cout << "신장은 " << inum << "센티미터이다.\n";

	return 0;
}

작은 사이즈의 형으로 변환한 경우에는 그 형으로 나타내지 못하는 부분은 실행 결과와 같이 잘려버리는 것이다.
예를 들면, 180.5라는 값은 int형의 변수에 그대로 저장할 수는 없다. 소수점 이하가 잘려버리고 180이라는 정수가 저장되는 것이다.

 

캐스트 연산자의 사용

 

형이 변환될 때에는 형을 변환하는 것을 명시적으로 쓸 수 있다. 다음의 캐스트 연산자(cast operator)라는 연산자를 살펴보도록 한다.

 

[구문 : 캐스트 연산자]

(형명) 식

캐스트 연산자는 지정한 식의 형을 () 내에 지정한 형으로 변환하는 연산을 수행한다.

 

위 예제에서 대입을 하고 있는 부분을 캐스트 연산자로 바꿔보면 다음과 같다.

...
inum = (int)dnum; //변환하는 형을 지정한다.
...

실행 결과는 앞의 것과 같이 된다. 캐스트 연산자를 사용하면 형을 변환하는 것을 명시적으로 기술할 수 있다.

 

큰 사이즈의 형으로 변환할 경우에도 사용할 수 있다.

dnum = (double)inum; //double형으로 변환한다.

 

다른 형의 연산

 

예제) 다른 형의 연산

정수형 변수와 double형 변수의 곱셈을 수행하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

int main()
{
	int d = 3;
	const double pi = 3.14;

	cout << "직경이 " << d << "센티미터의 원의\n";
	cout << "원주는 " << d * pi << "센티미터이다.\n"; //int형의 d가 double형으로 변환되어 연산된다.

	return 0;
}

여기서는 int형의 d의 값과 double형의 pi의 값의 곱셈을 하고 있다. C++에서는 일반적으로 연산자에 다른 형의 오퍼랜드를 기술한 경우

한쪽의 오퍼랜드를 큰 사이즈 쪽으로 형 변환하고 나서 연산을 수행한다.

는 규칙으로 되어 있다. 즉, 여기서는 int형 d값의 [3]이 double형의 수치[3.0]으로 변환되고 나서 곱셈이 수행되는 것이다. 구해진 식의 값은 double형의 값이 된다.

 

같은 형의 연산

 

같은 형을 연산하는 경우에는 같은 형으로 연산이 수행되고 결과도 그 형의 값으로 된다. 그러나 이 연산이 예상외의 결과로 되는 코드도 있다.

 

예제) 같은 형의 연산

정수형의 두 변수를 나누기(/) 연산을 수행하여 double형의 변수에 대입하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

int main()
{
	int num1 = 7;
	int num2 = 5;
	double div;

	div = num1 / num2; //여기서는 7÷5를 계산한다.

	cout << "7/5는 " << div << "이다.\n";

	return 0;
}

이 코드는 int형의 num1과 num2를 사용해서 7÷5의 결과를 double형의 변수 div에 대입한 것이다. [1.4]라는 double형이 출력될 것으로 기대하고 이와 같이 기술해본 것이다. 그러나 이 num1과 num2는 int형이므로 [7/5]가 [1]이라는 int형의 값으로 계산된다. 그 결과 출력은 [1]로 된다.

 

 

이 코드에서 [1.4]라는 출력을 얻기 위해서는 변수 num1과 num2에 적어도 한쪽을 double형으로 변환해야 한다. 나눗셈의 부분을 캐스트 연산자를 사용해서 다음과 같이 고쳐 쓴다.

...
div = (double)num1 / (double)num2; //캐스트 연산자를 사용한다.
...

그러면 코드를 변경한 경우의 실행 결과는 다음과 같다.

 

#include <iostream>
using namespace std;

int main()
{
	int num1 = 7;
	int num2 = 5;
	double div;

	div = (double)num1 / num2; //여기서는 7÷5를 계산한다.

	cout << "7/5는 " << div << "이다.\n";

	return 0;
}

이와 같이 코드를 변경함으로써 double형의 연산이 수행된다. 결과는 double형으로 되고 [1.4]라는 답을 출력할 수 있다. 연산을 할 경우는 오퍼랜드의 형에 주의해야 한다.

 

예제) 화씨를 섭씨로 변환

화씨온도를 키보드로 입력한 후 섭씨온도로 계산하는 코드를 작성해 보도록 한다. 단, 공식은 다음과 같다.

섭씨 온도 = (5 / 9) * (화씨 온도 - 32)
#include <iostream>
using namespace std;

int main()
{
	double fah, cel;

	cout << "화씨온도를 입력하세요=> ";
	cin >> fah;

	cel = (5 / 9) * (fah - 32);

	cout << "화씨온도 = " << fah << "이다.\n";
	cout << "섭씨온도 = " << cel << "이다.\n";

	return 0;
}

[(5/9)*(fah-32);]를 수행하면 실행 결과와 같이 화씨온도를 어떤 값을 입력해도 섭씨온도의 값은 0으로 출력된다. 즉, "정수/정수"는 정수 결과를 내므로 여기서 (5/9)는 0의 값을 출력하므로 0*(fah-32)의 식을 계산한다. 따라서 섭씨온도는 항상 0으로 출력된다.

 

위 예제의 코드를 다음과 같이 수정한다.

...
cel = (5.0 / 9) * (fah - 32);
...

그러면 아래 실행 결과와 같이 섭씨온도가 제대로 계산된 것을 확인할 수 있다.

(5.0 / 9)는 "실수/정수"로 데이터형이 큰 쪽으로 형 변환이 일어나서 "실수/실수"로 계산되어 실수형의 결과를 출력한다.

 

 

출처: 박흥복서정희. 2015. C++ 프로그래밍 (초보자를 위한). 문운당

'개발 > C++' 카테고리의 다른 글

C++ 제어문2  (0) 2022.03.10
C++ 제어문  (0) 2022.03.08
C++ 식과 연산자  (0) 2022.02.25
C++ 변수2  (0) 2022.02.20
C++ 변수  (0) 2022.02.17