Namespaces
Variants

Expressions

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

표현식은 연산을 지정하는 일련의 연산자 와 그 피연산자 로 구성됩니다.

표현식 평가는 결과를 생성할 수 있으며(예: 2 + 2 의 평가는 4 라는 결과를 생성함), 부수 효과를 발생시킬 수도 있습니다(예: std:: printf ( "%d" , 4 ) 의 평가는 표준 출력에 문자 '4' 을 인쇄함).

각 C++ 표현식은 두 가지 독립적인 속성으로 특징지어집니다: 타입과 값 범주.

목차

일반

  • 값 카테고리 (lvalue, rvalue , glvalue, prvalue, xvalue (C++11부터) )는 표현식을 값에 따라 분류합니다
  • 평가 순서 는 인수와 하위 표현식의 중간 결과가 얻어지는 순서를 지정합니다

연산자

일반 연산자
assignment increment
decrement
arithmetic logical comparison member
access
other

a = b
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
a - > b
a. b
a - > * b
a. * b

함수 호출

a ( ... )
콤마

a, b
조건부 연산자

a ? b : c
특수 연산자

static_cast 관련된 타입 간 변환을 수행
dynamic_cast 상속 계층 구조 내에서 변환을 수행
const_cast cv -한정자를 추가하거나 제거
reinterpret_cast 관련 없는 타입 간 변환을 수행
C-style cast static_cast , const_cast , 그리고 reinterpret_cast 의 조합으로 타입 변환을 수행
new 동적 저장 기간을 가진 객체를 생성
delete new 표현식으로 생성된 객체를 파괴하고 획득한 메모리 영역을 해제
sizeof 타입의 크기를 조회
sizeof... pack 의 크기를 조회 (C++11부터)
typeid 타입의 정보를 조회
noexcept 표현식이 예외를 발생시킬 수 있는지 확인 (C++11부터)
alignof 타입의 정렬 요구사항을 조회 (C++11부터)

변환

메모리 할당

기타

기본 표현식

모든 연산자의 피연산자는 다른 표현식이나 기본 표현식일 수 있습니다(예: 1 + 2 * 3 에서 operator+의 피연산자는 하위 표현식 2 * 3 과 기본 표현식 1 입니다).

기본 식(primary expressions)은 다음 중 하나입니다:

(C++26부터)
(C++11부터)
(C++17부터)
(C++20부터)

괄호 안의 모든 표현식은 기본 표현식으로도 분류됩니다: 이는 괄호가 모든 연산자보다 높은 우선순위를 가짐을 보장합니다. 괄호는 값, 타입, 그리고 값 범주를 보존합니다.

리터럴

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

  • char 또는 wchar_t
  • char16_t 또는 char32_t
(C++11부터)
  • char8_t
(C++20부터)
  • const char [ ] 또는 const wchar_t [ ]
  • const char16_t [ ] 또는 const char32_t [ ]
(C++11부터)
  • const char8_t [ ]
(C++20부터)
(C++11부터)

완전-표현식

구성 요소 표현식 은 다음과 같이 정의됩니다:

  • 표현식의 구성 표현식은 해당 표현식입니다.
  • brace-enclosed initializer list 또는 (괄호로 둘러싸인) expression list의 구성 표현식은 해당 리스트 요소들의 구성 표현식들입니다.
  • = 로 시작하는 initializer 의 구성 표현식은 initializer-clause 의 구성 표현식들입니다.
int num1 = 0;
num1 += 1; // 사례 1: "num += 1"의 구성 표현식은 "num += 1"입니다
int arr2[2] = {2, 22} // 사례 2: "{2, 22}"의 구성 표현식은
                      //         "2"와 "22"입니다
                      // 사례 3: "= {2, 22}"의 구성 표현식은
                      //         "{2, 22}"의 구성 표현식입니다
                      //         (즉, "2"와 "22"입니다)

E 표현식의 직접적인 하위 표현식들 은 다음과 같습니다

  • E 피연산자들의 구성 표현식,
(C++14부터)
(C++11부터)
  • E 가 암시적으로 호출하는 모든 함수 호출, 또는
  • E 가 함수 호출이거나 암시적으로 함수를 호출하는 경우, 호출에서 사용된 각 기본 인자 의 구성 표현식.

표현식 E 부분식(subexpression) E 의 직접적인 부분식이거나, E 의 직접적인 부분식의 부분식입니다. 람다 표현식의 "함수 본체"에 나타나는 표현식들은 람다 표현식의 부분식이 아니라는 점에 유의하십시오. (C++11부터)

다음 표현식들은 full-expressions  입니다:

(C++20부터)
(C++26부터)
  • 다른 어떤 표현식의 하위 표현식이 아니고 다른 어떤 완전 표현식의 일부가 아닌 표현식

언어 구조가 함수의 암시적 호출을 생성하도록 정의된 경우, 언어 구조의 사용은 이 정의의 목적을 위해 표현식으로 간주됩니다. 표현식이 나타나는 언어 구조의 요구 사항을 충족시키기 위해 표현식의 결과에 적용되는 변환도 전체 표현식의 일부로 간주됩니다.

초기화자의 경우, 엔티티의 초기화를 수행하는 것 (집합체의 기본 멤버 초기화자를 평가하는 것을 포함) (C++14부터) 또한 완전 표현식(Full-expression)의 일부로 간주됩니다.

잠재적으로 평가되는 표현식

표현식은 다음의 경우를 제외하고 잠재적으로 평가됩니다 :

  • sizeof 연산자의 피연산자인 경우, 또는
  • typeid 연산자의 피연산자이며 다형성 클래스 타입의 lvalue를 지정하지 않는 경우.
(C++11까지)

다음 피연산자들은 평가되지 않는 피연산자 이며, 평가되지 않습니다:

(C++20부터)

표현식은 다음의 경우를 제외하고 잠재적으로 평가됩니다 :

  • 평가되지 않는 피연산자인 경우, 또는
  • 평가되지 않는 피연산자의 하위 표현식인 경우.
(C++11부터)

잠재적으로 평가되는 표현식은 ODR-use 입니다.

폐기 값 표현식

폐기값 표현식(discarded-value expression) 은 부수 효과(side-effects)만을 위해 사용되는 표현식입니다. 이러한 표현식에서 계산된 값은 폐기됩니다. 이러한 표현식에는 모든 표현식 문(expression statement) 의 전체 표현식(full-expression), 내장 쉼표 연산자(built-in comma operator)의 왼쪽 피연산자, 또는 void 타입으로 캐스팅하는 캐스트 표현식(cast-expression)의 피연산자가 포함됩니다.

배열-대-포인터 및 함수-대-포인터 변환은 폐기된-값 표현식에 의해 계산된 값에 절대 적용되지 않습니다. lvalue-대-rvalue 변환은 오직 표현식이 volatile-qualified glvalue이고 다음 형태 중 하나를 가질 경우에만 적용됩니다 (내장 의미 필요, 가능하면 괄호로 묶인):

  • id-expression,
  • array subscript expression,
  • class member access expression,
  • indirection,
  • pointer-to-member operation,
  • conditional expression where both the second and the third operands are one of these expressions,
  • comma expression where the right operand is one of these expressions.

또한, lvalue가 volatile 한정 클래스 타입인 경우, 결과로 생성되는 rvalue 임시 객체를 초기화하기 위해 volatile 복사 생성자가 필요합니다.

표현식이 void가 아닌 prvalue인 경우(발생했을 수 있는 lvalue-to-rvalue 변환 후), temporary materialization 이 발생합니다.

컴파일러는 void 로의 캐스트를 제외한 표현식이 [[ nodiscard ]] 로 선언된 값을 버릴 때 경고를 발생시킬 수 있습니다.

(since C++17)

표현식 동등성(Expression-equivalence)

여러 표현식 e1 , e2 , ..., eN 은 다음 모든 조건을 만족할 때 표현식-동등(expression-equivalent) 하다고 합니다:

  1. 모두 동일한 효과를 가집니다.
  2. 모두 상수 부분식(constant subexpressions) 이거나 모두 그렇지 않습니다.
  3. 모두 noexcept 이거나 모두 그렇지 않습니다.

e1 e2 표현식-동등(expression-equivalent)하다 는 것은 e1 e2 가 표현식-동등한 것과 필요충분조건이며 (이는 e2 e1 와도 표현식-동등함을 의미합니다).

(C++20부터)

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
CWG 1054 C++98 volatile 변수에 값을 할당하면 할당 결과에
적용되는 lvalue-to-rvalue 변환으로 인해
불필요한 읽기가 발생할 수 있음
discarded-value 표현식을 도입하고
이 경우를 변환이 필요한 경우 목록에서
제외함
CWG 1343 C++98 집합체 초기화에서 소멸자 호출 순서가
불충분하게 명세됨
집합체 초기화의 full-expression이
명확하게 명세됨
CWG 1383 C++98 discarded-value 표현식에 lvalue-to-rvalue
변환이 적용되는 표현식 목록에
오버로드된 연산자도 포함됨
기본 의미를 가진 연산자만
포함하도록 수정
CWG 1576 C++11 discarded-value volatile xvalue 표현식에
lvalue-to-rvalue 변환이 적용되지 않음
이 경우에도 변환을
적용함
CWG 2249 C++98 선언자에서 선언될 식별자가
id-expression이 아니었음
id-expression으로 명시
CWG 2431 C++11 참조에 바인딩된 임시 객체의 소멸자 호출이
full-expression이 아니었음
full-expression으로 명시

참고 항목

C 문서 for Expressions