C++ 연산자

C++Beginner

소개

이 랩에서는 C++ 에서 연산자를 사용하는 방법을 배우게 됩니다. 산술 연산자, 관계 연산자, 논리 연산자 및 비트 연산자를 사용하는 방법을 배우게 됩니다.

콘텐츠 미리보기

기본 숫자 및 논리 데이터의 경우, 연산자를 사용하여 작업을 수행합니다. 다른 언어와 마찬가지로 C++ 은 연산자에 대한 완벽한 지원을 제공합니다. 이제 연산자를 배우기 시작해 봅시다.

  • 산술 연산 (Arithmetic Operations)
  • 혼합형 연산 (Mixed-Type Operations)
  • 복합 할당 연산자 (Compound Assignment Operators)
  • 형변환 (Type-Casting)
  • 관계 및 논리 연산자 (Relational and Logical Operators)

산술 연산

C++ 는 숫자에 대해 다음과 같은 산술 연산자를 지원합니다.

연산자 설명 사용법 예시
* 곱셈 (Multiplication) expr1 * expr2 2 3 → 6; 3.3 1.0 → 3.3
/ 나눗셈 (Division) expr1 / expr2 1 / 2 → 0; 1.0 / 2.0 → 0.5
% 나머지 (Modulus) expr1 % expr2 5 % 2 → 1; -5 % 2 → -1
+ 덧셈 (Addition) expr1 + expr2 1 + 2 → 3; 1.1 + 2.2 → 3.3
- 뺄셈 (Subtraction) expr1 - expr2 1 - 2 → -1; 1.1 - 2.2 → -1.1

위의 모든 연산자는 이항 연산자이며, 두 개의 피연산자를 사용합니다. 곱셈, 나눗셈 및 나머지는 덧셈과 뺄셈보다 우선순위를 갖습니다.

int/intint를 생성하며, 결과가 잘림에 유의하는 것이 중요합니다. 1/2 → 0 ( 0.5가 아님).

혼합형 연산

산술 연산의 피연산자가 동일한 유형에 속하는 경우, 해당 유형으로 연산이 수행되고 결과도 해당 유형에 속합니다. 그러나 두 피연산자가 다른 유형에 속하는 경우, 컴파일러는 작은 유형의 값을 더 큰 유형으로 승격시킵니다 ( 암시적 형변환 (implicit type-casting) 이라고 함). 그런 다음 연산은 더 큰 유형으로 수행됩니다.

유형 예시 연산
int 2 + 3 int 2 + int 3 → int 5
double 2.2 + 3.3 double 2.2 + double 3.3 → double 5.5
mix 2 + 3.3 int 2 + double 3.3 → double 2.0 + double 3.3 → double 5.3
int 1 / 2 int 1 / int 2 → int 0
double 1.0 / 2.0 double 1.0 / double 2.0 → double 0.5
mix 1 / 2.0 int 1 / double 2.0 → double 1.0 + double 2.0 → double 0.5

예시

/* Testing mix-type arithmetic operations */
#include <iostream>
#include <iomanip>   // needed for formatting floating-point numbers
using namespace std;

int main() {
   int i1 = 2, i2 = 4;
   double d1 = 2.5, d2 = 5.0;

   // floating-points in fixed format with 1 decimal place
   cout<<fixed<<setprecision(1);

   cout << i1 << " + " << i2 << " = " << i1+i2 << endl;  // 6
   cout << d1 << " + " << d2 << " = " << d1+d2 << endl;  // 7.5
   cout << i1 << " + " << d2 << " = " << i1+d2 << endl;  // 7.0  <==

   cout << i1 << " - " << i2 << " = " << i1-i2 << endl;  // -2
   cout << d1 << " - " << d2 << " = " << d1-d2 << endl;  // -2.5
   cout << i1 << " - " << d2 << " = " << i1-d2 << endl;  // -3.0 <==

   cout << i1 << " * " << i2 << " = " << i1*i2 << endl;  // 8
   cout << d1 << " * " << d2 << " = " << d1*d2 << endl;  // 12.5
   cout << i1 << " * " << d2 << " = " << i1*d2 << endl;  // 10.0 <==

   cout << i1 << " / " << i2 << " = " << i1/i2 << endl;  // 0    <==
   cout << d1 << " / " << d2 << " = " << d1/d2 << endl;  // 0.5
   cout << i1 << " / " << d2 << " = " << i1/d2 << endl;  // 0.4  <==
   return 0;
}

출력:

2 + 4 = 6
2.5 + 5.0 = 7.5
2 + 5.0 = 7.0
2 - 4 = -2
2.5 - 5.0 = -2.5
2 - 5.0 = -3.0
2 * 4 = 8
2.5 * 5.0 = 12.5
2 * 5.0 = 10.0
2 / 4 = 0
2.5 / 5.0 = 0.5

image desc

오버플로우 / 언더플로우 (Overflow / Underflow)

// Range of int is [-2147483648, 2147483647]
   int i1 = 2147483647;      // max int
   cout << i1 + 1 << endl;   // -2147483648 (overflow)
   cout << i1 * i1 << endl;  // 1

   int i2 = -2147483648;     // min int
   cout << i2 - 1 << endl;   // 2147483647 (underflow)
   cout << i2 * i2 << endl;  // 0

산술 연산에서 결과 값은 범위를 초과하면 감싸집니다 (wraps around). C++ 런타임은 오류/경고 메시지를 발행하지 않지만 잘못된 결과를 생성합니다. 오버플로우/언더플로우를 확인하는 것은 프로그래머의 책임이라는 점에 유의하는 것이 중요합니다.

복합 할당 연산자

C++ 는 또한 다음과 같이 나열된 소위 복합 할당 연산자를 제공합니다.

연산자 사용법 설명 예시
= var = expr RHS 의 값을 LHS 의 변수에 할당 x = 5;
+= var += expr var = var + expr과 동일 x += 5; x = x + 5 와 동일
-= var -= expr var = var - expr과 동일 x -= 5; x = x - 5 와 동일
*= var *= *expr* var = var * expr과 동일 x = 5; x = x 5 와 동일
/= var /= expr var = var / expr과 동일 x /= 5; x = x / 5 와 동일
%= var %= expr var = var % expr과 동일 x %= 5; x = x % 5 와 동일
++ ++x 전위 증가 (Pre-Increment) y=++x; x=x+1; y=x 와 동일
++ x++ 후위 증가 (Post-Increment) y=x++; oldX=x; x=x+1; y=oldX 와 동일
-- --x 전위 감소 (Pre-Decrement) y=--x; x=x-1; y=x 와 동일
-- x-- 후위 감소 (Post-Decrement) y=x--; oldX=x; x=x-1; y=oldX 와 동일
x = 5;
cout << x++ << endl;  // Save x (5); Increment x (=6); Print old x (5).
x = 5;
cout << ++x << endl;  // Increment x (=6); Print x (6).

암시적 타입 변환 vs 명시적 타입 캐스팅

기본 (내장) 유형의 값을 다른 기본 유형의 변수에 할당할 때, C++ 는 두 유형이 호환되는 경우 값을 수신 유형으로 자동 변환합니다. 예를 들어,

  • int 값을 double 변수에 할당하면 컴파일러는 자동으로 int 값을 double로 캐스팅 (예: 1 에서 1.0 으로) 하고 이를 double 변수에 할당합니다.
  • double 값을 int 변수에 할당하면 컴파일러는 자동으로 double 값을 int 값으로 캐스팅 (예: 1.2 에서 1 로) 하고 이를 int 변수에 할당합니다. 소수 부분은 잘리고 손실됩니다. 일부 컴파일러는 "정밀도 손실 가능성"에 대한 경고/오류를 발생시키고, 다른 컴파일러는 그렇지 않습니다.
 int i;
 double d;

 i = 3;
 d = i;    // Assign an int value to double
 cout << "d = " << d << endl;  // 3.0

 d = 5.5;
 i = d;    // Assign a double value to int
 cout << "i = " << i << endl;  // 5 (truncated, no warning!)

(new-type) operand 또는 new-type (operand) 형식의 소위 단항 형변환 연산자를 통해 명시적으로 형변환을 수행할 수 있습니다. 형변환 연산자는 특정 유형의 피연산자 하나를 취하고 새로운 유형의 동등한 값을 반환합니다. 덧셈 연산이 두 개의 피연산자를 포함하지만, 덧셈 연산과 유사하게 결과 값을 생성하는 연산이라는 점에 유의하십시오. 예를 들어,

cout << (double)5 << endl;  // int 5 → double 5.0
cout << (int)5.5 << endl;   // double 5.5 → int 5

double aDouble = 5.6;
int anInt = (int)aDouble; // return 5 and assign to anInt. aDouble does not change!

// C++ also supports function-style type cast.
cout << double(5) << endl;     // 5.0
cout << int(5.5) << endl;      // 5
cout << int(aDouble) << endl;  // 5

관계 연산자 및 논리 연산자

대부분의 경우, 취할 조치를 결정하기 전에 두 값을 비교해야 합니다. C++ 는 여섯 개의 비교 연산자 (또는 관계 연산자) 를 제공합니다.

연산자 설명 사용법 예시 (x=5, y=8)
== 같음 (Equal to) expr1 == expr2 (x == y) → false
!= 같지 않음 (Not Equal to) expr1 != expr2 (x != y) → true
> 큼 (Greater than) expr1 > expr2 (x > y) → false
>= 크거나 같음 (Greater than or equal to) expr1 >= expr2 (x >= 5) → true
< 작음 (Less than) expr1 < expr2 (y < 8) → false
<= 작거나 같음 (Less than or equal to) expr1 >= expr2 (y <= 8) → true
&& 논리 AND expr1 && expr2 --------
|| 논리 OR expr1 || expr2 --------
! 논리 NOT !expr --------
^ 논리 XOR expr1 ^ expr2 --------

진리표는 다음과 같습니다.

AND (&&) true false
true true false
false false false
OR (||) true false
true true true
false true false
NOT (!) true false
false true
XOR (^) true false
true false true
false true false
// Return true if x is between 0 and 100 (inclusive)
(x >= 0) && (x <= 100)
// wrong to use 0 <= x <= 100

// Return true if x is outside 0 and 100 (inclusive)
(x < 0) || (x > 100)   //or
!((x >= 0) && (x <= 100))

// Return true if year is a leap year
// A year is a leap year if it is divisible by 4 but not by 100, or it is divisible by 400.
((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)

요약

이 부분은 비교적 쉽습니다. 이전 섹션과 연관시켜야 합니다. 암기할 필요 없이, 머릿속에서 그들의 논리를 이해하십시오.