wellcome_공부일기

C++ | 03.01 연산자 우선순위와 결합법칙(Operator precedence and associativity ) 본문

프로그래밍/C++

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를 공부한 토대로 작성되었습니다. 

 

Comments