C++ Expressions and Statements

이영준·2024년 12월 4일
0

C++ 기본문법

목록 보기
12/12

Expression

표현식은 단순한 값을 만들거나 연산자를 사용해 값들을 결합해서 또 다른 새로운 값을 만드는 식이다.

  • 표현식끼리 결합하여 새로운 표현식을 만들 수 있고, C++의 연산자는 피연산자를 3개까지 가질 수 있다.
  • C++에는 19개의 표현식이 있다. (아래 표엣는 간단하고 자주 쓰이는 5개만 표시돼 있다.)

간단히 몇가지의 표현식을 살펴보면 아래와 같다.
Pred : 우선순위
Assoc : 결합방향

기본 표현식

연산자 없이 구성된 간단한 표현식.

  • 우선순위는 19로 표현식 중 가장 높다

리터럴

고정값을 나타내는 리터럴도 표현식.
참고로 short 형 리터럴은 없다.

name

변수, 객체, 함수 이름 등 이름도 기본 표현식임

  • 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

할당 연산자의 왼쪽에 놓을 수 있는 값은 lvalue (값의 목적지),
할당 연산자의 오른쪽에 놓을 수 있는 값은 rvalue( 값의 소스) 이다.

근데
x = x+3의 경우, x는 할당 연산자의 왼쪽과 오른쪽에 모두 온다. 이 경우에는 값의 목적지이자 소스이므로 lvalue이자 rvalue가 된다.

형 변환

암묵적 자료형 변환

서로 다른 자료형을 연산하면 C++ 컴파일러는 연산 전에 암묵적 자료형 변환을 수행.

타입 승격

  1. 피연산자의 자료형이 산술 연산에 적합하지 않은 경우 (bool, char)
  2. 피연산자의 자료형에 맞은 연산자가 없는 경우 (short 또는 float)

자료형을 보는 법

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로 캐스팅)
profile
컴퓨터와 교육 그사이 어딘가

0개의 댓글