이름공간
변수
행위

표현식

cppreference.com
< cpp‎ | language
 
 
C++ 언어
General topics
Flow control
Conditional execution statements
Iteration statements
Jump statements
Functions
function declaration
lambda function declaration
function template
inline specifier
exception specifications (deprecated)
noexcept specifier (C++11)
Exceptions
Namespaces
Types
decltype specifier (C++11)
Specifiers
cv specifiers
storage duration specifiers
constexpr specifier (C++11)
auto specifier (C++11)
alignas specifier (C++11)
Initialization
Literals
Expressions
alternative representations
Utilities
Types
typedef declaration
type alias declaration (C++11)
attributes (C++11)
Casts
implicit conversions
const_cast conversion
static_cast conversion
dynamic_cast conversion
reinterpret_cast conversion
C-style and functional cast
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
class template
function template
template specialization
parameter packs (C++11)
Miscellaneous
Inline assembly
 
 

표현식은 계산을 지정하는 '연산자'와 '피연산자'의 연속체입니다.

표현식 평가는 결과를 만들어 내고 (예. 2+2 의 평가는 4 라는 결과를 만들어 냅니다) 부수 효과(side-effects)를 생성할 수도 있습니다 (예. std::printf("%d",4)'4' 라는 글자를 표준 출력에 표시합니다).

C++의 표현식은 2개의 독립적인 속성으로 구분될 수 있습니다. : 타입과 값(value) 카테고리

목차

[편집] 일반

  • value categories (lvalue, rvalue, glvalue, prvalue, xvalue) 는 값에 따라 표현식을 분류합니다.
  • 인자와 하위 표현식의 평가 순서 는 중간 결과를 획득하는 순서를 명시합니다.

[편집] 연산자

일반 연산자
대입 증가
감소
산술 논리 비교 멤버
접근
기타

a = b
a = rvalue
a += b
a -= b
a *= b
a /= b
a %= b
a &= b
a |= b
a ^= b
a <<= b
a >>= b

++a
--a
a++
a--

+a
-a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

!a
a && b
a || b

a == b
a != b
a < b
a > b
a <= b
a >= b

a[b]
*a
&a
a->b
a.b
a->*b
a.*b

a(...)
a, b
(type) a
? :

Special operators

static_cast 는 타입을 다른 호환 가능한 타입으로 변환합니다
dynamic_cast 는 가상 기반 클래스를 해당 클래스를 상속한 하위 클래스로 변환합니다.
const_cast 는 타입을 다른 cv 제한자를 가진 호환 가능한 타입으로 변환합니다.
reinterpret_cast 는 타입을 호환되지 않는 타입으로 변환합니다.
new 는 메모리를 할당합니다.
delete 는 할당된 메모리를 해제합니다.
sizeof 는 타입의 크기를 조회합니다.
sizeof...parameter pack 의 크기를 조회합니다.(since C++11)
typeid 는 타입 정보를 조회합니다.
noexcept 는 표현식이 예외(exception)을 던질 수 있는지 검사합니다. (since C++11)
alignof 는 타입이 요구하는 정렬법을 조회합니다. (since C++11)

  • 연산자 우선순위 는 연산자와 그의 인자를 처리할 순서를 정의합니다
  • 대체 표현 은 일부 연산자를 위한 대체 철자법(spellings) 입니다
  • 연산자 오버로딩 은 사용자 정의 클래스에 대한 연산자의 동작을 명시할 수 있게 합니다.

[편집] 변환

[편집] 메모리 할당

[편집] 기타

[편집] 주요 표현식

어떤 연산자의 피연산자든 다른 표현식이나 기본 표현식 (예. 1+2*3에서, 연산자+ 의 피연산자는 하위 표현식 2*3이고 기본 표현식은 1 입니다)

기본 표현식은 아래의 어느 것도 가능합니다:

괄호안의 표현식은 기본 표현식으로도 분류할 수 있습니다: 괄호는 어떤 연산자보다도 높은 우선 순위를 갖는 것이 보장됩니다. 괄호는 값, 타입, 값 카테고리를 보존합니다.

[편집] 리터럴

리터럴은 소스 코드에 포함된 상수 값을 나타내는 C++ 프로그램의 토큰들입니다.

  • char 또는 wchar_t
  • char16_t 또는 char32_t (since C++11)
  • char8_t (since C++20)
  • const char[] 또는 const wchar_t[]
  • const char16_t[] 또는 const char32_t[] (since C++11)
  • const char8_t[] (since C++20)
  • 불리언 리터럴 truefalse 값을 갖는 bool 타입 값입니다
  • nullptr 는 널 포인터(null pointer)값을 지칭하는 포인터 리터럴입니다. (since C++11)
  • 사용자 정의 리터럴 은 사용자 정의 타입의 상수값입니다. (since C++11)

[편집] 평가되지 않는 표현식

typeid, sizeof, noexceptdecltype (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