- 3.1.1 연산자 우선순위(Operator Precedence)
- 3.1.2 결합 법칙(Associativity) 활용
- 3.1.3 산술 연산자(arithmetic operators)
- 3.1.4 증감 연산자(increment decrement operators)
3.1.1 연산자 우선순위(Operator Precedence)
사칙연산을 배울 때 우리는 덧셈과 뺄셈보다 곱셈과 나눗셈을 먼저 계산한다는 우선순위를 정해서 연산을 수행한다. 프로그래밍 언어도 많은 연산자가 존재하기 때문에 연산자에 대한 우선순위가 필요하다. 연산자 우선순위를 의도적으로 외우려 하는 것은 매우 힘들기 때문에 일반적으로 연산자 우선순위에 대한 표를 검색으로 찾아서 보거나 결합 법칙을 활용한다.
https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
Operators in C and C++ - Wikipedia
From Wikipedia, the free encyclopedia Jump to navigation Jump to search Similar syntax in both computer languages This is a list of operators in the C and C++ programming languages. All the operators listed exist in C++; the column "Included in C", states
en.wikipedia.org
3.1.2 결합 법칙(Associativity) 활용
연산자 우선순위는 프로그래밍을 계속하면 몇 가지는 체화되지만 안 되는 것들이 존재할 수 있다. 그럴 때는 의도적으로 괄호를 통해 결합 법칙을 이용하는 방법을 생각할 수 있다. 순서가 애매하다면 프로그래머가 직접 ()를 통해 순서를 확실히 한다.
#include <iostream>
int main()
{
using namespace std;
int x = 4 + 2 * 3; // 약속된 연산자 우선순위로 계산된다.
int y = (4 + 2) * 3; // 결합법칙 활용
return 0;
}
경험적으로 봤을 때 결합법칙을 활용하는 경우는 조건문에 많은 조건들이 붙거나 매크로가 여러 번 걸쳐지면서 애매해지는 순간 정도였던 것 같다.
3.1.3 산술 연산자(arithmetic operators)
산술 연산자는 우리가 흔히 알고 있는 사칙연산과 나머지 값을 반환하는 modulus operator(나머지 연산)이 있다. 또한 피연산자의 수에 따라 산술 연산자를 분류할 수 있다.
아래는 피연산자가 하나인 단항 연산자이다. 우리가 흔히 숫자에 부호를 넣어주는 형태로 사용할 수가 있다.
#include <iostream>
int main()
{
using namespace std;
int x = 1;
int unaryOperatorMinus = -x;
int unaryOperatorPlus = +x;
return 0;
}
아래는 피연산자가 두 개인 이항 연산자 중 나누기와 나머지 연산에 대해 다루었다.
#include <iostream>
int main()
{
using namespace std;
int operand1 = 7;
int operand2 = 4;
cout << operand1 / operand2 << endl; // return 1
cout << float(operand1) / operand2 << endl; // return 1.75
cout << operand1 / float(operand2) << endl; // return 1.75
cout << float(operand1) / float(operand2) << endl; // return 1.75
cout << -5 / 2 << endl; // c++ 11부터는 소수점 아래를 절삭하기로 했음 return -2
cout << -5 % 2 << endl; // return -1
cout << -5 % -2 << endl; // return -1
cout << 5 % -2 << endl; // return 1
// 복합 연산자
// 코딩 작업 내용을 줄여준다.
// 실수를 줄여준다. 보기가 편해진다.
operand2 += operand1;
return 0;
}
정수 자료형에 대해 나누기 연산을 수행할 경우 주의할 점은 소수점 아래가 절삭된다는 점이다. 이전에는 이에 대해 어떻게 처리해야 할지 컴파일러마다 모호했지만 C++ 11부터는 소수점 아래를 절삭하는 것으로 결정 났다. 음수에 대한 나머지 연산 또한 return 값에 대해 주의 깊게 볼 필요가 있다. 나누는 피연산자의 부호는 상관없이 나누어지는 수의 부호에 따라 결과 값이 달라진다.
이항 연산자는 복합 연산자가 존재한다. 복합 연산자는 코딩 작업 내용을 줄여주며 이에 따라 실수를 줄여줄 수 있고 보기가 편해진다. 처음에는 불편할지 몰라도 계속 쓰다 보면 익숙해지는 것이 복합 연산자이다.
3.1.4 증감 연산자(increment decrement operators)
반복문에서 자주 볼 수 있는 연산자가 바로 증감 연산자이다. 반복문 내에서 반복 횟수를 설정하기 위해서 사용한다면 크게 고민 없이 사용할 연산자이지만 그 외의 경우에 쓴다면 전위와 후위에 따른 결과의 차이를 알고 있어야 한다.
#include <iostream>
int main()
{
using namespace std;
int number = 5;
int prefixDecrementNumber = --number;
int postfixDecrementNumber = number--;
cout << prefixDecrementNumber << endl;
cout << postfixDecrementNumber << endl;
return 0;
}
위 코드의 실행 결과는 아래와 같다.
여기서는 차이를 느낄 수 없는 구조이지만 아래의 코드를 실행하면 차이를 확연하게 알 수 있을 것이다.
#include <iostream>
int main()
{
using namespace std;
int number01 = 6;
int number02 = 6;
cout << number01 << " " << number02 << endl;
cout << ++number01 << " " << --number02 << endl;
cout << number01++ << " " << number02-- << endl; // number01을 스트림으로 보낸 뒤에 1을 더해준다.
cout << number01 << " " << number02 << endl;
return 0;
}
전위 증감 연산자는 해당 연산자가 존재하는 명령문에 도착했을 때 명령문을 수행하기 전 증감 연산자를 수행하고 후위 증감 연산자는 해당 연산자가 존재하는 명령문을 먼저 실행하고서 증감 연산자를 수행한다. 즉, 전위 후위 연산자에 따라 해당 연산자가 존재하는 명령문의 결과가 달라지니 이를 염두에 두고 프로그래밍을 해야 한다.
#include <iostream>
int add(int a, int b)
{
return a + b;
}
int main()
{
using namespace std;
int number03 = 1;
int number04 = 2;
int addNumber = add(number03, ++number03);
cout << addNumber << endl;
addNumber = add(number03, ++number04);
cout << addNumber << endl;
return 0;
}
이런 방식으로 프로그래밍을 하면 의도와는 다른 결과를 많이 볼 수 있으니 증감 연산자를 사용할 때는 신중하자.
'Programming Language > C++' 카테고리의 다른 글
Section 3.3. 관계 연산자와 논리 연산자 (0) | 2021.11.03 |
---|---|
Section 3.2. sizeof/comma/조건 연산자 (0) | 2021.11.02 |
Section 2.7. 리터럴 상수와 심볼릭 상수 (0) | 2021.10.19 |
Section 2.6. char 자료형 (0) | 2021.10.18 |
Section 2.5. Boolean 자료형 (0) | 2021.10.15 |