C++ 연산자

C++Beginner

소개

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

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 74%입니다.학습자들로부터 98%의 긍정적인 리뷰율을 받았습니다.

콘텐츠 미리보기

기본 숫자 및 논리 데이터의 경우, 연산자를 사용하여 작업을 수행합니다. 다른 언어와 마찬가지로 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)

요약

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