표현식은 단순한 값을 만들거나 연산자를 사용해 값들을 결합해서 또 다른 새로운 값을 만드는 식이다.
- 표현식끼리 결합하여 새로운 표현식을 만들 수 있고, C++의 연산자는 피연산자를 3개까지 가질 수 있다.
- C++에는 19개의 표현식이 있다. (아래 표엣는 간단하고 자주 쓰이는 5개만 표시돼 있다.)
간단히 몇가지의 표현식을 살펴보면 아래와 같다.
Pred : 우선순위
Assoc : 결합방향
연산자 없이 구성된 간단한 표현식.
- 우선순위는 19로 표현식 중 가장 높다
고정값을 나타내는 리터럴도 표현식.
참고로 short 형 리터럴은 없다.
변수, 객체, 함수 이름 등 이름도 기본 표현식임
x
변수 이름cout
객체 이름std :: cout
네임스페이스가 붙은 이름우선순위가 낮은 표현식을 기본 표현식으로 변경하기 위해서는 괄호로 묶는다.
(x + 3) * 5
// After adding the value of x with 3, multiply the result by 5
하나의 값에 -, +, sizeof 등의 피연산자를 사용한 표현식
- -x, +y 등
- sizeof expression 표현식의 크기 구하기
- sizeof(type) 자료형의 크기 구하기
왼쪽과 오른쪽에 피연산자가 있는 이항 표현식으로 곱셈, 나눗셈, 나누기
- 3* 4
- 30 % 5 (나머지)
- 30 / 5 (나누기) 등
왼쪽과 오른쪽에 피연산자가 있는 이항 표현식으로 덧셈, 뺄셈
값을 만들면서 컴퓨터의 메모리 상태를 변경하는 부가 작용이 발생하는 표현식. '=' 을 사용
- 단순할당 : a = 14;
- 복합할당 : a-=10; (두개의 연산자를 붙여 사용해야 함)
참고로 할당 표현식 자체를 리턴하면 할당된 값이 리턴된다.
int main () {
// Variable Declaration int x;
int y;
// First assignment
cout << "Return value of assignment expression: " << (x = 14) << endl;
cout << "Value of variable x: " << x << endl;
// Second assignment cout << "Return value of assignment expression: " << (y = 87) << endl;
cout << "Value of variable y: " << y;
return 0;
Run:
Return value of assignment expression: 14
Value of variable x: 14
Return value of assignment expression: 87
Value of variable y: 87
할당 연산자의 왼쪽에 놓을 수 있는 값은 lvalue (값의 목적지),
할당 연산자의 오른쪽에 놓을 수 있는 값은 rvalue( 값의 소스) 이다.
근데
x = x+3의 경우, x는 할당 연산자의 왼쪽과 오른쪽에 모두 온다. 이 경우에는 값의 목적지이자 소스이므로 lvalue이자 rvalue가 된다.
서로 다른 자료형을 연산하면 C++ 컴파일러는 연산 전에 암묵적 자료형 변환을 수행.
자료형을 보는 법
typeid (expression).name()
int main() { // Declarations bool x = true;
bool x = true;
char y = 'A';
short z = 14;
float t = 24.5;
// Type conversion from bool to int
cout << "Type of x + 100: " << typeid (x + 100).name() << endl;
cout << "Value of x + 100: " << x + 100 << endl;
// Type conversion from char to int
cout << "Type of y + 1000: " << typeid (y + 1000).name() << endl;
cout << "Value of y + 1000: " << y + 1000 << endl;
// Type conversion from short to int
cout << "Type of z * 100: " << typeid (z * 10).name() << endl;
cout << "Value of z * 100: " << z * 100 << endl;
// Type conversion from float to double cout << "Type of t + 15000.2: " << typeid (t + 15000.2).name() << endl;
cout << "Value of t + 15000.2: " << t + 15000.2;
return 0;
}
Run:
Type of x + 100: i // Type is integer
Value of x + 100: 101
Type of y + 1000: i // Type is integer
Value of y + 1000: 1065
Type of z 100: i // Type is integer
Value of z 100: 1400
Type of t + 15000.2: d // Type is double
Value of t + 15000.2: 15024.7
이미 암묵적 자료형 승격이 일어난 bool, char, short, unsigned short, float 의 경우 아래처럼 추가적으로 암묵적 자료형 변환이 일어나지 않는다.
예를 들어 long + int 를 하면 자동으로 long 타입으로 캐스팅 된 결과가 출력된다.
소스와 대상의 자료형이 다른 경우 대입하는 대상에 맞게 자료형을 변경한다.
int 에 double을 대입하면 int로,
double에 int를 대입하면 double로.
#include <iostream>
#include <typeinfo>
using namespace std;
int main ( ) { // Declaration int x;
double y;
// Assignment
x = 23.67;
y = 130;
// Checking type and value of x
cout << "Type of x = 23.67: " << typeid (x = 23.67).name ()<<endl;
cout << "Value of x after assignment: " << x << endl << endl;
// Checking type and value of x
cout << "Type of y = 130: " << typeid (y = 130).name ()<<endl;
cout << "Value of y after assignment: " << y << endl;
return 0;
}
Run:
Type of x = 23.67: i // Type is int
Value of x after assignment: 23
Type of y = 130: d // Type is double
Value of y after assignment: 130
자료형을 강제로 변환하는 것. 캐스팅이라고도 한다
static_cast<자료형>(표현식)
/*************************************************************** * Comparing implicit and explicit conversion in an expression * ***************************************************************/ #include <iostream> using namespace std;
int main ( ) {
// Declaration
double x = 23.56;
int y = 30;
// Allowing implicit conversion
cout << "Without casting: " << x + y <<endl;
// Forcing explicit conversion
cout << "With casting: " << static_cast <int> (x) + y;
return 0;
}
>Run:
Without casting: 53.56 (y가 승격되어 double형변환)
With casting: 53 (x를 int로 캐스팅)