Expressions (C++)

From RAD Studio
Jump to: navigation, search

Go Up to Expressions Index

An expression is a sequence of operators, operands, and punctuators that specifies a computation. The formal syntax, listed in C++Builder expressions, indicates that expressions are defined recursively: subexpressions can be nested without formal limit. (However, the compiler will report an out-of-memory error if it can't compile an expression that is too complex.)

Note: C++Builder expressions show how identifiers and operators are combined to form grammatically legal "phrases".

Expressions are evaluated according to certain conversion, grouping, associativity, and precedence rules that depend on the operators used, the presence of parentheses, and the data types of the operands. The standard conversions are detailed in Methods used in standard arithmetic conversions. The way operands and subexpressions are grouped does not necessarily specify the actual order in which they are evaluated by the compiler (see Evaluation order).

Expressions can produce an lvalue, an rvalue, or no value. Expressions might cause side effects whether they produce a value or not

The precedence and associativity of the operators are summarized in Associativity and precedence of C++Builder operators. The grammar in C++Builder expressions, completely defines the precedence and associativity of the operators.

C++Builder expressions

primary-expression:
	literal
	this (C++ specific)
	:: identifier (C++ specific)
	:: operator-function-name (C++ specific)
	:: qualified-name (C++ specific)
	(expression)
	name

literal:
	integer-constant
	character-constant
	floating-constant
	string-literal
name:
	identifier
	operator-function-name (C++ specific)
	conversion-function-name (C++ specific)

       ~ class-name (C++ specific)
	qualified-name (C++ specific)

qualified-name: (C++ specific)
	qualified-class-name :: name
postfix-expression:
	primary-expression
	postfix-expression  [ expression ]
	postfix-expression  (<expression-list>)
       simple-type-name (<expression-list>) (C++ specific)

       postfix-expression  .  name
	postfix-expression  ->  name
	postfix-expression  ++

       postfix-expression  --
	const_cast < type-id > ( expression ) (C++ specific)
	dynamic_cast < type-id > ( expression ) (C++ specific)
	reinterpret_cast < type-id > ( expression ) (C++ specific)
	static_cast < type-id > ( expression ) (C++ specific)
	typeid ( expression ) (C++ specific)
	typeid ( type-name ) (C++ specific)
expression-list:
	assignment-expression
	expression-list  ,  assignment-expression
unary-expression:
	postfix-expression
	++ unary-expression
	- - unary-expression
	unary-operator  cast-expression
	sizeof unary-expression
	sizeof ( type-name )
	allocation-expression (C++ specific)
	deallocation-expression (C++ specific)
unary-operator: one of & * + - !
allocation-expression: (C++ specific)
	<::> new <placement> new-type-name <initializer>
	<::> new <placement> (type-name) <initializer>
placement: (C++ specific)
      (expression-list)
new-type-name: (C++ specific)
      type-specifiers <new-declarator>
new-declarator: (C++ specific)
       ptr-operator <new-declarator>
       new-declarator [<expression>]
deallocation-expression: (C++ specific)
	<::> delete cast-expression
	<::> delete [] cast-expression
cast-expression:
	unary-expression
	( type-name )  cast-expression

pm-expression:
	cast-expression
	pm-expression .* cast-expression (C++ specific)
	pm-expression ->* cast-expression (C++ specific)
multiplicative-expression:
	pm-expression
	multiplicative-expression  *  pm-expression
	multiplicative-expression  /  pm-expression
	multiplicative-expression  %  pm-expression
additive-expression:
	multiplicative-expression
	additive-expression  +  multiplicative-expression
	additive-expression  -  multiplicative-expression
shift-expression:
       additive-expression
	shift-expression  <<  additive-expression
	shift-expression  >>  additive-expression
relational-expression:
	shift-expression
	relational-expression  <   shift-expression
	relational-expression  >   shift-expression
	relational-expression  <=  shift-expression
	relational-expression  >=  shift-expressionequality-expression:
	relational-expression
	equality expression  ==  relational-expression
	equality expression  !=  relational-expression
AND-expression:
	equality-expression
	AND-expression  &  equality-expression
exclusive-OR-expression:
	AND-expression
	exclusive-OR-expression ^ AND-expression
inclusive-OR-expression:
	exclusive-OR-expression
	inclusive-OR-expression | exclusive-OR-expression
logical-AND-expression:
       inclusive-OR-expression
	logical-AND-expression && inclusive-OR-expression
logical-OR-expression:
	logical-AND-expression
	logical-OR-expression || logical-AND-expression
conditional-expression:
	logical-OR-expression
	logical-OR-expression ? expression : conditional-expression
assignment-expression:
	conditional-expression
	unary-expression  assignment-operator  assignment-expression
assignment-operator: 
       one of =, *=, /=, %=, +=, -= <<, =>, >=, &=, ^=, |=
expression:
	assignment-expression
	expression , assignment-expression
constant-expression:
	conditional-expression