오늘은 연산자 우선순위와 결합 법칙에 대해 이해해 보자.
https://ko.wikipedia.org/wiki/C%EC%99%80_C%2B%2B%EC%9D%98_%EC%97%B0%EC%82%B0%EC%9E%90
위의 링크는 C와 C++연산자 우선순위에 대한 참고 자료이다. 꼭 한번 보고 오자!
왜 보아야 하는가?
#include <iostream>
using namespace std;
int main()
{
int x = 4 + 2 * 3;
return 0;
}
이 경우에는 당연히 2*3을 먼저하고 나온 값에 4를 더하는 식으로 계산을 진행한다. 이는 사칙연산을 해봤으면 당연하게 이해되는 부분이다. 하지만 이런 경우가 문제가 된다.
#include <iostream>
using namespace std;
int main()
{
int x = 4 / 2 * 3;
return 0;
}
나눗셈 연산자와 곱셈 연산자는 같은 레벨로 동등한 위치이다. 이럴 경우에는 무엇을 먼저 계산해야 하는가(?)에 대한 고뇌에 빠지게 된다. 이런 경우 Associativity를 봐야하는데 위의 링크에 들어가 우선 순위를 확인해보면 곱셈과 나눗셈은 Left to right로 되어 있다. 이 경우에는 나눗셈 계산을 먼저하고 곱하기 계산을 하는 것이다.
그럼 Right to Left를 보자. Level 3에 있다.
자주 사용하는 증감연산자나 논리 연산자 같은 경우 나중에 제대로 설명할 것이니 우선은 이 연산자를 사용하면 Right to Left라는 것을 알아두도록 하자.
애매할 땐, 괄호를 사용하여 우선순위를 나누면 된다.
아 그리고 우리가 뭔가를 제곱할 때를 생각해보자. 수학에서 x^2처럼 표현하지 않는가? 근데 C++에선 ^연산자는 exlcusive XOR 연산자여서 제곱처럼 사용할 수 없다. 그럼 어떻게 해야하는가?
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int x = std::pow(2, 3);
cout << x << endl;
return 0;
}
output = 8
이렇게 cmath 헤더를 포함시켜 사용하긴 하는데, 유용하진 않다. 왜냐? pow()같은 경우 double형을 반환하는 것이 일반적이다. 근데 나는 int형으로 사용하고 있고... 좀 문제가 있다고 생각되지 않는가? 그러다 보니 제곱하는 경우에는 자신이 직접 함수로 만들고 사용하는 경우가 많다.
정수에 대한 제곱 프로그램을 만든다면 간단하게 이런식으로 만들면 될 것 같다.
// 사용자로부터 입력받은 정수를 제곱해주는 프로그램을 만들어 보자.
#include <iostream>
using namespace std;
int squared(int sq_input)
{
int sq_output(0);
sq_output = sq_input * sq_input;
return sq_output;
}
int main()
{
//direct initialization
int user_input(0), user_output(0);
cout << "정수를 입력해주세요 " << endl;
cin >> user_input;
user_output = squared(user_input);
cout << "User분께서 입력하신 정수에 대한 제곱 값은 : " << user_output << endl;
return 0;
}