C++:后缀表达式


后缀表达式包含主表达式或者其中的后缀运算符跟在主表达式之后的表达式。 下表列出了后缀运算符。

后缀运算符

运算符名称 运算符表示法
下标运算符 [ ]
函数调用运算符 ( )
显式类型转换运算符 类型名称 ( )
成员访问运算符 . 或 ->
后缀递增运算符 ++
后缀递减运算符 –

以下语法描述了可能的后缀表达式:

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 运算符被视为后缀表达式。

形式和实际自变量

调用程序会将信息传递到“自变量”中的已调用函数。 已调用函数使用对应的“形式自变量”访问信息。

当调用函数时,将执行以下任务:

计算所有实参(调用方提供的参数)。 没有计算这些自变量的隐含顺序,但所有自变量都会计算,并且所有副作用都会在进入该函数前完成。

使用每个形参在表达式列表中对应的实参来初始化该形参。 (形参是在函数头中声明并在函数体中使用的自变量。 ) 转换就像通过初始化一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++实现后缀表达式求值的方法一般是使用栈来实现。具体步骤如下: 1. 定义一个操作数栈num,用于存储操作数。 2. 遍历后缀表达式数组,对于每个元素进行如下操作: a. 如果是操作数,则将其转换为int类型并压入操作数栈num中。 b. 如果是运算符,则从操作数栈num中弹出两个操作数,进行相应的运算,并将结果压入操作数栈num中。 3. 遍历完后缀表达式数组后,操作数栈num中必定只剩下一个数,这个数就是表达式的运算结果。 4. 返回操作数栈num中的栈顶元素即可。 下面是一个示例代码: ``` int solve(vector<string> postexp) { stack<int> num; //操作数栈 int len = postexp.size(); int i = 0; while(i < len){ if(postexp[i] != "+" && postexp[i] != "-" && postexp[i] != "*"){ int tmp = atoi(postexp[i].c_str()) ; //操作数(string类型转换为int型) num.push(tmp); //将操作数压入栈中 i++; } else{ int opnum1 = num.top(); num.pop(); int opnum2 = num.top(); num.pop(); int res = 0; //运算结果 char op= postexp[i][0]; //字符串的第一个字符(实际上也只有一个字符) switch(op){ //注意两个操作数的顺序,栈顶元素作为第二个操作数 case '+': res = opnum2 + opnum1; break; case '-': res = opnum2 - opnum1; break; case '*': res = opnum2 * opnum1; break; case '/': res = opnum2 / opnum1; break; default: break; } num.push(res); i++; } } return num.top(); //最后栈中必定只剩下一个数,就是运算结果 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值