표현식
표현식은 계산을 지정하는 '연산자'와 '피연산자'의 연속체입니다.
표현식 평가는 결과를 만들어 내고 (예. 2+2 의 평가는 4 라는 결과를 만들어 냅니다) 부수 효과(side-effects)를 생성할 수도 있습니다 (예. std::printf("%d",4) 는 '4' 라는 글자를 표준 출력에 표시합니다).
C++의 표현식은 2개의 독립적인 속성으로 구분될 수 있습니다. : 타입과 값(value) 카테고리
목차 |
[편집] 일반
- value categories (lvalue, rvalue, glvalue, prvalue, xvalue) 는 값에 따라 표현식을 분류합니다.
- 인자와 하위 표현식의 평가 순서 는 중간 결과를 획득하는 순서를 명시합니다.
[편집] 연산자
일반 연산자 | ||||||
---|---|---|---|---|---|---|
대입 | 증가 감소 |
산술 | 논리 | 비교 | 멤버 접근 |
기타 |
a = b |
++a |
+a |
!a |
a == b |
a[b] |
a(...) |
Special operators | ||||||
static_cast 는 타입을 다른 호환 가능한 타입으로 변환합니다 |
- 연산자 우선순위 는 연산자와 그의 인자를 처리할 순서를 정의합니다
- 대체 표현 은 일부 연산자를 위한 대체 철자법(spellings) 입니다
- 연산자 오버로딩 은 사용자 정의 클래스에 대한 연산자의 동작을 명시할 수 있게 합니다.
[편집] 변환
- 표준 변환 하나의 타입을 다른 타입으로 암묵적인 변환
-
const_cast
변환 -
static_cast
변환 -
dynamic_cast
변환 -
reinterpret_cast
변환 - explicit cast C형식의 cast 명시나 함수적 명시를 이용한 변환
- 사용자 정의 변환 은 사용자 정의 클래스에 대한 변환을 명시할 수 있게 합니다
[편집] 메모리 할당
- new 표현식 은 메모리를 동적으로 할당합니다.
- delete 표현식 은 메모리를 동적으로 할당 해제합니다.
[편집] 기타
- 상수 표현식 은 컴파일할 때 평가될 수 있고 컴파일 타임 컨텍스트(템플릿 인자, 배열 크기, 등)에 사용할 수 있습니다
-
sizeof
-
alignof
-
typeid
- throw-expression
[편집] 주요 표현식
어떤 연산자의 피연산자든 다른 표현식이나 기본 표현식 (예. 1+2*3에서, 연산자+ 의 피연산자는 하위 표현식 2*3이고 기본 표현식은 1 입니다)
기본 표현식은 아래의 어느 것도 가능합니다:
- 리터럴 (예. 2 또는 "Hello, world")
- Id-표현식,
- 람다 표현식 (since C++11)
- Fold 표현식 (since C++17)
- Requires-표현식 (since C++20)
괄호안의 표현식은 기본 표현식으로도 분류할 수 있습니다: 괄호는 어떤 연산자보다도 높은 우선 순위를 갖는 것이 보장됩니다. 괄호는 값, 타입, 값 카테고리를 보존합니다.
[편집] 리터럴
리터럴은 소스 코드에 포함된 상수 값을 나타내는 C++ 프로그램의 토큰들입니다.
- 정수 리터럴 은 정수 타입의 10진수, 8진수, 16진수, 2진수입니다.
- character 리터럴 은 아래 타입의 개별 글자들입니다
- char 또는 wchar_t
- char16_t 또는 char32_t (since C++11)
- char8_t (since C++20)
- 부동 소수점 리터럴 은 float, double 또는 long double 타입의 값입니다
- 문자열 리터럴 은 아래 타입의 글자들의 연속체입니다.
- const char[] 또는 const wchar_t[]
- const char16_t[] 또는 const char32_t[] (since C++11)
- const char8_t[] (since C++20)
- 불리언 리터럴 true 와 false 값을 갖는 bool 타입 값입니다
-
nullptr
는 널 포인터(null pointer)값을 지칭하는 포인터 리터럴입니다. (since C++11) - 사용자 정의 리터럴 은 사용자 정의 타입의 상수값입니다. (since C++11)
[편집] 평가되지 않는 표현식
typeid
, sizeof
, noexcept
와 decltype
(since C++11) 연산자들은 피연산자들의 컴파일할 때의 속성을 질의하기 때문에, 연산자의 피연산자는 평가되지 않는 표현식입니다. (피연산자들이 다형성(polymorphic) glvalue 이고 typeid의 피연산자가 아닌 한) 따라서, std::size_t n = sizeof(std::cout << 42); 는 콘솔 출력을 하지 않습니다.
평가되지 않는 연산자는 더 큰 표현식의 구문적인 피연산자이더라도 완전 표현식으로 간주합니다. (예를 들어, sizeof(T()) 는 T::~T 에 접근할 수 있어야 합니다) |
(since C++14) |
The requires-표현식 도 평가되지 않는 표현식입니다. |
(since C++20) |
[편집] 폐기값 표현식
페기값 표현식은 표현식의 부수 효과(side-effects)만을 위해 사용하는 표현식입니다. 이 표현식으로 부터 계산된 값은 폐기됩니다. 이 표현식은 표현식 실행문, 내장 쉼표(comma) 연산자의 좌변 피연산자 또는 void 로 캐스팅하는 cast표현식의 피연산자의 완전한 표현식을 포함합니다
배열을 포인터로 변환하거나 함수를 포인터로 변환하는 경우에 대해서는 폐기값 표현식에 의해 계산된 값을 적용할 수 없습니다. lvalue 를 rvalue 로 변환하는 경우에 대해서는 표현식이 volatile-제한된 glvalue 이고 다음의 형태 중의 하나(내장의 의미를 요구하거나 괄호로 둘러싸인 경우)에 대해서만 적용할 수 있습니다.
- id-표현식,
- 배열 첨자 표현식,
- 클래스 멤버 접근 표현식,
- 간접 지정,
- 멤버 지정 연산자,
- 두 번째와 세 번째 피연산자가 모두 위 표현식 중 하나인 조건 표현식
- 오른쪽 피연산자가 위 표현식 중 하나인 쉼표 표현식
추가로, lvalue 가 volatile 제한된 클래스 타입이면, volatile 복사 생성자는 임시로 rvalue 결과값을 초기화해야만 합니다.
{{rrev|since=c++17| 표현식이 void 가 아닌 prvalue 이면 (발생할 수 있는 lvalue-to-rvalue 변환 이후) 임시 구체화(materialization) 가 발생합니다.
void
로 캐스팅하는 것 이외의 다른 표현식이 [[nodiscard]]
로 선언된 값을 폐기하는 경우 컴파일러는 경고를 발생시킬 수 있습니다.
[편집] 더 보기
C documentation for Expressions
|