Scala前缀,中缀及后缀运算详解

语法:PostfixExpr ::= InfixExpr [id [nl]]InfixExpr ::= PrefixExpr| InfixExpr id [nl] Inf2424ixExprPrefixExpr ::= [- | + | ! | ~] SimpleExpr表达式由算符和操作数构成。6.12.1. 前缀运算前缀运算op e由前缀算符op(必须是+, -, !或~之一)。表达式op e等价于后缀方法应用e.unary_op。前缀算符不同于普通的函数应用,他们的操作数表达式不一定是原子的。例如,输入序列-sin(x)读取为-(sin(x)),函数应用negate sin(x)将被解析为将中缀算符sin应用于操作数negate和(x)。6.12.2. 后缀操作后缀算符可以是任意标识符。后缀操作e op被解释为e.op。6.12.3. 中缀操作中缀算符可以是任意标识符。中缀算符的优先级和相关性定义如下:中缀算符的优先级由算符的第一个字符确定。字符按照优先级升序在下面列出,同一行中的字符具有同样的优先级。(所有字母)|^&< >= !:+ -* / %(所有其他特殊字符)也就是说,由字母开头的算符具有最低的优先级,然后是由|开头的算符,下同。这个规则中有一个例外,就是赋值算符(§6.12.4)。赋值算符的优先级与简单赋值(=)相同。也就是比任何其他算符的优先级要低。算符的相关性由算符的最后一个字符确定。由:结尾的算符是右相关的。其他所有算符是左相关的。算符的优先级和相关性确定了表达式部件结组的方式: 如果表达式中有多个中缀运算,那么具有高优先级的算符将比优先级低的绑定的更紧。 如果具有连贯的中缀运算e0 op1 e1 op2…opn en,且算符op1,…,opn具有同样的优先级,那么所有的这些算符将具有同样的相关性。如果所有算符都是左相关的,该序列将解析为(…(e0 op1 e1) op2…) opn en。否则,如果所有算符都是右相关的,则该序列将解析为e0 op1(e1 op2 (…opn en)…)后缀算符的优先级总是比中缀算符低。例如e1 op1 e2 op2总是等价于(e1 op1 e2) op2。左相关算符的右侧操作数可以由在括号中的几个参数组成,例如e op(e1,…,en)。该表达式将被解析为e.op(e1,…,en)。左相关位运算e1 op e2解析为e1.op(e2)。如果op是右相关的,同样的运算将被解析为{ val x=e1; e2.op(x) },这里x是一个新的名称。6.12.4. 赋值算符赋值算符是一个由等号“=”结尾的算符记号((§1.1)中的语法类op),但具有以下条件的算符除外:(1) 算符也由等号开始,或(2) 算符是(<=), (>=), (!=)中的一个赋值算符做特殊处理,如果没有其它有效的解释,则扩展为赋值。我们考虑一个赋值算符,,比如+=。在中缀运算l += r中,l和r是表达式。该运算可以重新解释为负责赋值的运算l = l + r除非该运算的做的l只计算一次在以下两种条件下会发生再解析。1. 左侧的l没有一个名为+=的成员,且不能由隐式转换(§6.25)转换为拥有成员+=的值。2. 赋值运算l = l + r是类型正确的。特别此处暗含了l引用了一个变量或对象,且该变量或对象可以赋值,且可转变为一个具有名为+的成员的值。

即使爬到最高的山上,一次也只能脚踏实地地迈一步。

Scala前缀,中缀及后缀运算详解

相关文章:

你感兴趣的文章:

标签云: