后缀表达式包含主表达式或者其中的后缀运算符跟在主表达式之后的表达式。 下表列出了后缀运算符。
后缀运算符
运算符名称 运算符表示法
下标运算符 [ ]
函数调用运算符 ( )
显式类型转换运算符 类型名称 ( )
成员访问运算符 . 或 ->
后缀递增运算符 ++
后缀递减运算符 –
以下语法描述了可能的后缀表达式:
primary-expression
postfix-expression[expression]postfix-expression(expression-list)simple-type-name(expression-list)postfix-expression.namepostfix-expression->namepostfix-expression++postfix-expression--cast-keyword < typename > (expression )typeid ( typename )
上面的 后缀表达式 可以是 主表达式 或其他后缀表达式。 后缀表达式从左到右进行分组,这允许表达式按如下方式链接起来:
func(1)->GetValue()++
在上述表达式中, func 是一个主要表达式,是 func(1) 函数后缀表达式, func(1)->GetValue 是指定类的成员的后缀表达式, func(1)->GetValue() 是另一个函数后缀表达式,整个表达式是后缀表达式递增 GetValue 的返回值。 该表达式的整体含义是作为自变量传递 1 的 "call func,并作为返回值获取一个指向类的指针。 然后对 GetValue() 该类调用,并递增返回的值。
上面列出的表达式是赋值表达式,这意味着这些表达式的结果必须为右值。
后缀表达式形式
simple-type-name ( expression-list )
指示构造函数的调用。 如果 simple-type-name 是基本类型,则表达式列表必须是单个表达式,并且该表达式指示表达式的值将转换为基础类型。 此类强制转换表达式模仿构造函数。 由于此形式允许使用相同的语法来构造基本类型和类,因此它在定义模板类时特别有用。
Cast 关键字 为 dynamic_cast 、 static_cast 或之一 reinterpret_cast 。
typeid 运算符被视为后缀表达式。
形式和实际自变量
调用程序会将信息传递到“自变量”中的已调用函数。 已调用函数使用对应的“形式自变量”访问信息。
当调用函数时,将执行以下任务:
计算所有实参(调用方提供的参数)。 没有计算这些自变量的隐含顺序,但所有自变量都会计算,并且所有副作用都会在进入该函数前完成。
使用每个形参在表达式列表中对应的实参来初始化该形参。 (形参是在函数头中声明并在函数体中使用的自变量。 ) 转换就像通过初始化一样