소개
이 랩에서는 C++ 에서 연산자를 사용하는 방법을 배우게 됩니다. 산술 연산자, 관계 연산자, 논리 연산자 및 비트 연산자를 사용하는 방법을 배우게 됩니다.
이 랩에서는 C++ 에서 연산자를 사용하는 방법을 배우게 됩니다. 산술 연산자, 관계 연산자, 논리 연산자 및 비트 연산자를 사용하는 방법을 배우게 됩니다.
기본 숫자 및 논리 데이터의 경우, 연산자를 사용하여 작업을 수행합니다. 다른 언어와 마찬가지로 C++ 은 연산자에 대한 완벽한 지원을 제공합니다. 이제 연산자를 배우기 시작해 봅시다.
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/int는 int를 생성하며, 결과가 잘림에 유의하는 것이 중요합니다. 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

오버플로우 / 언더플로우 (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).
기본 (내장) 유형의 값을 다른 기본 유형의 변수에 할당할 때, 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)
이 부분은 비교적 쉽습니다. 이전 섹션과 연관시켜야 합니다. 암기할 필요 없이, 머릿속에서 그들의 논리를 이해하십시오.