일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- compile time constants
- const
- Runtime constants
- standford University
- regression problem
- CLion
- 본즈앤올
- classification problem
- C++
- 코드블럭 오류
- 단항연산자
- Greedy
- #endif
- 기계학습
- Andrew Ng
- 연산자
- sizeof()
- 이코테
- coursera
- #define
- 프로그래밍
- 형변환
- 코딩테스트
- algorithm
- 학습 알고리즘
- decimal
- 나동빈님
- 기계학습 기초
- Machine Learning
- 홍정모님
- Today
- Total
wellcome_공부일기
C++ | 03.01 연산자 우선순위와 결합법칙(Operator precedence and associativity ) 본문
C++ | 03.01 연산자 우선순위와 결합법칙(Operator precedence and associativity )
ma_heroine 2020. 5. 13. 23:20<목차>
1. 연산자 우선순위(Operator precedence)
2. 연산자 결합법칙(Operator associativity)
3. C++ 연산자 표
4. Quiz & Solutions
연산자 우선순위(Operator precedence)
- 연산자 우선순위(Operator precedence)는 어떤 식에서 다른 우선순위를 가진 둘 이상의 연산자 중 어떤 연산자가 먼저 수행될지 결정합니다.
- 4 + 3 * 2라는 식에서, 우리는 정규 수학 우선순위에 따라 더하기 전에 곱하는 것을 먼저 수행해줍니다. -> 4 + (3 * 2)
- 하지만 C++에서 컴파일러가 4 + 3 * 2 식을 만났을 때, 식을 분석하고 어떻게 계산할지 결정합니다.
- 위 과정을 수행하기 위해, 모든 연산자들은 우선순위 레벨를 할당받습니다.
- 가장 높은 우선순위 레벨의 연산자가 가장 먼저 평가됩니다.
- 연산자 표를 보면 곱셈, 나눗셈(level 5)이 덧셈, 뺄셈(level 6)보다 높다는 것을 확인할 수 있습니다.
- 따라서 4 + 2 *3은 곱셈이 덧셈보다 우선순위가 높기 때문에 4 + (2 * 3)으로 계산합니다.
연산자 결합법칙(Operator associativity)
- 연산자 결합법칙(Operator associativity)은 동일한 우선 순위를 가진 두 연산자가 표현식에 나타날 때 사용됩니다.
- 결합법칙(associativity) 왼쪽에서 오른쪽으로 또는 오른쪽에서 왼쪽으로 2가지로 수행될 수 있습니다.
- 예를 들어, 3 * 4 / 2 식에서 곱셈 연산자와 나누기 연산자는 모두 우선 순위 level 5입니다.
- 이 경우, 컴파일러는 결과를 계산하는 방법을 결정하기 위해 우선순위에만 의존할 수 없습니다.
- 한 식에서 우선 순위가 동일한 두 연산자가 서로 인접해 있으면, 연산자의 결합법칙(Operator associativity)은 연산자를 왼쪽에서 오른쪽으로 계산할 것인지(L -> R) 아니면 오른쪽에서 왼쪽으로 계산할 것인지(R -> L)를 컴파일러에게 알려줍니다.
- 우선 순위 level 5의 연산자는 (L -> R)의 연관성을 가지므로, 식은 (L -> R)로 계산됩니다.: (3 * 4) / 2 = 6
연산자 우선순위를 모두 외울 순 없으므로, 괄호 ()를 사용하여 더 명백하게 식을 표현할 수 있습니다.
C++ 연산자 표
Level 1이 가장 높은 우선순위를, Level 17이 가장 낮은 우선순위를 가집니다.
L->R은 왼쪽 계산 후, 오른쪽을 계산 하고, R->L은 오른쪽 계산 후, 왼쪽을 계산 합니다.
연산자 중에 지수를 나타내는 연산자는 없으므로, <cmath>를 전처리기에 추가하여 pow를 사용해야 합니다.
아래 표의 출처는 https://www.learncpp.com/cpp-tutorial/operator-precedence-and-associativity/ 입니다.
Prec/AssOperatorDescriptionPattern
1 None | :: :: |
Global scope (unary) Namespace scope (binary) |
::name class_name::member_name |
2 L->R | () () () {} type() type{} [] . -> ++ –– typeid const_cast dynamic_cast reinterpret_cast static_cast |
Parentheses Function call Initialization Uniform initialization (C++11) Functional cast Functional cast (C++11) Array subscript Member access from object Member access from object ptr Post-increment Post-decrement Run-time type information Cast away const Run-time type-checked cast Cast one type to another Compile-time type-checked cast |
(expression) function_name(parameters) type name(expression) type name{expression} new_type(expression) new_type{expression} pointer[expression] object.member_name object_pointer->member_name lvalue++ lvalue–– typeid(type) or typeid(expression) const_cast<type>(expression) dynamic_cast<type>(expression) reinterpret_cast<type>(expression) static_cast<type>(expression) |
3 R->L | + - ++ –– ! ~ (type) sizeof & * new new[] delete delete[] |
Unary plus Unary minus Pre-increment Pre-decrement Logical NOT Bitwise NOT C-style cast Size in bytes Address of Dereference Dynamic memory allocation Dynamic array allocation Dynamic memory deletion Dynamic array deletion |
+expression -expression ++lvalue ––lvalue !expression ~expression (new_type)expression sizeof(type) or sizeof(expression) &lvalue *expression new type new type[expression] delete pointer delete[] pointer |
4 L->R | ->* .* |
Member pointer selector Member object selector |
object_pointer->*pointer_to_member object.*pointer_to_member |
5 L->R | * / % |
Multiplication Division Modulus |
expression * expression expression / expression expression % expression |
6 L->R | + - |
Addition Subtraction |
expression + expression expression - expression |
7 L->R | << >> |
Bitwise shift left Bitwise shift right |
expression << expression expression >> expression |
8 L->R | < <= > >= |
Comparison less than Comparison less than or equals Comparison greater than Comparison greater than or equals |
expression < expression expression <= expression expression > expression expression >= expression |
9 L->R | == != |
Equality Inequality |
expression == expression expression != expression |
10 L->R | & | Bitwise AND | expression & expression |
11 L->R | ^ | Bitwise XOR | expression ^ expression |
12 L->R | | | Bitwise OR | expression | expression |
13 L->R | && | Logical AND | expression && expression |
14 L->R | || | Logical OR | expression || expression |
15 R->L | ?: = *= /= %= += -= <<= >>= &= |= ^= |
Conditional Assignment Multiplication assignment Division assignment Modulus assignment Addition assignment Subtraction assignment Bitwise shift left assignment Bitwise shift right assignment Bitwise AND assignment Bitwise OR assignment Bitwise XOR assignment |
expression ? expression : expression lvalue = expression lvalue *= expression lvalue /= expression lvalue %= expression lvalue += expression lvalue -= expression lvalue <<= expression lvalue >>= expression lvalue &= expression lvalue |= expression lvalue ^= expression |
16 R->L | throw | Throw expression | throw expression |
17 L->R | , | Comma operator | expression, expression |
Quiz
a) x = 3 + 4 + 5;
b) x = y = z;
c) z *= ++y + 5;
d) a || b && c || d;
Solutions
위의 연산자 표를 참고하면 됩니다.
a) x = ((3 + 4) + 5);
b) x = (y = z);
c) z *= ((++y) + 5);
d)(a || (b && c)) || d;
* 해당 글은 learncpp를 공부한 토대로 작성되었습니다.
'프로그래밍 > C++' 카테고리의 다른 글
C++ | 03.03 증가/ 감소 연산자(Increment/ Decrement) 주의사항 (0) | 2020.05.15 |
---|---|
C++ | 03.02 산술 연산자(Arithmetic operator) (0) | 2020.05.14 |
C++ | 02.11 Runtime vs Compile time constants (0) | 2020.05.12 |
C++ | 02.10 기호 상수(Symbolic constants) (0) | 2020.05.11 |
C++ | 02.09 리터럴 상수(Literal constants)와 진수들 (0) | 2020.05.10 |