6.3 运算符的优先级与结合性

在小时候学习数学时,老师总会强调四则运算中的先乘除后加减、从左向右计算等规则。其实在Swift语言编程中,也有这样的规则存在。例如,进行如下混合运算:

        /*
         运算结果23
         过程如下:
         2*10 = 20
         20*3 = 60
         60/4 = 15
         8+15 = 23
         */
        8+2*10*3/4

从上面演示代码中可以看出,Swift语言中的四则运算也是先进行乘除运算后进行加减运算,运算顺序为从左向右。其实在Swift语言的运算符体系中,有着优先级与结合性的概念,运算符的优先级决定同一行代码中出现多种运算符时的计算顺序,运算符的结合性决定运算符是从左向右运算还是从右向左运算。任何运算符都有默认的优先级,开发者自定义的运算符也是如此,优先级越高的运算符优先执行。对于结合性而言,由于前缀运算符与后缀运算符都只有一个操作数,因此它只对中缀运算符有意义。

表6-1和表6-2列出了Swift中所有运算符的相关信息:

表6-1 Swift语言中的系统前缀运算符

表6-2 Swift语言中的系统中缀运算符

(续表)

上面两个表格中列举了Swift语言系统定义的所有运算符相关信息,无需专门记忆,在实际开发中需要使用时再来查表即可。其实更多情况下,开发者会直接使用小括号来决定表达式的执行顺序,这样代码也会更加直观。

在重载运算符操作时,并不会改变原运算符的结合性和优先级,但对于自定义运算符,开发者可以设置其结合性与优先级,示例如下:

        infix operator ++{associativity left precedence 140}

associativity关键字用于声明运算符的结合性,可以选择left或者right来定义成左结合性或者右结合性,precedence关键字用于声明运算符的优先级。