Golang的运算符优先级实操案例
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.运算符优先级案例
运算符是用来在程序运行时执行数学或逻辑运算的,在Go语言中,一个表达式可以包含多个运算符,当表达式中存在多个运算符时,就会遇到优先级的问题,此时应该先处理哪个运算符呢? 经过前面的学习,想必大家对Golang中支持的运算符有一定的了解了,其实Golang中的运算符大致分为四类,即特殊(后缀)运算符,单目运算符,双目运算符和逗号运算符。 特殊(后缀)运算符: 比如:小括号("()"),中括号("[]"),点(".")等 单目运算符: 一个运算符需要一个标识符(变量,常量,函数返回值)可以参与计算。 双目运算符: 一个运算符需要两个标识符参与计算。 优先级别从高到底依次为算数运算符,比较运算符,位运算符,逻辑运算符,赋值运算符。 逗号运算符: 使用最后一个逗号的值作为结果。 综上所述,Go语言运算符的优先级从高到底大致分为:特殊运算符优先级高于单目运算符,单目运算符优先级高于双目运算符,双目运算符优先级高于逗号运算符。 而实际上Go语言有几十种运算符,被分成十几个级别,有的运算符优先级不同,有的运算符优先级相同。Go语言中常见的操作符优先级由高到底顺序依次如下所示:
后缀运算符:
典型代表:"()","[]","->",优先级顺序为从左到右。
单目运算符:
典型代表:"-"(负号),"+"(正号),"--"(自减),"++"(自加),"&"(取内存地址),"*"(指针类型,取值),"!"(取反,即逻辑非),优先级顺序为从左到右。
算数运算符:
典型代表:"*"(乘号),"/"(除号),"%"(取余),"+"(加法),"-"(减法),优先级顺序为从左到右。
位移运算符:
典型代表:"<<"(左移),">>"(右移),优先级顺序为从左到右。
关系/比较运算符:
典型代表:"<","<=",">",">=","==","!=",优先级顺序为从左到右。
位逻辑运算符:
典型代表:"&"(按位与),"^"(按位异或),"|"(按位或),优先级顺序为从左到右。
逻辑运算符:
典型代表:"&&"(短路与),"||"(短路或),优先级顺序为从左到右
赋值运算符:
典型代表:"|=","^=","&=","<<=",">=","%=","/=","*=","-=","+=","=",优先级顺序为从左到右。
逗号运算符:
典型代表:","
关于运算符的优先级的使用小技巧: (1)记不住,用括号 (2)长表达式,多用括号, (3)易懂、易读
二.运算符优先级案例
package main import ( "fmt" ) func main() { /* 判断用户输出的年份是否是闰年 */ var year int fmt.Printf("请输入年份:>>> ") //给用户做一个输入提示信息 fmt.Scan(&year) fmt.Printf("判断%d年是否是闰年,结果为%t ", year, year%4 == 0 && year%100 != 0 || year%400 == 0) /* 分析上面的"year%4 == 0 && year%100 != 0 || year%400 == 0"中语句的包含的运算符优先级如下所示: (1)算数运算符 year%4 year%100 year%400 (2)关系/比较运算符: year%4 == 0 year%400 == 0 year%100 != 0 (3) 逻辑运算符: year%4 == 0 && year%100 != 0 year%4 == 0 && year%100 != 0 || year%400 == 0 代码改进分析: 如上分析所示,根据操作符优先级表查出先做算数运算符,再做比较运算符,最后再做逻辑运算符。 代码的可读性较差,每次都得去查表,生产环境我们可以使用一些优先级的小技巧: (1)记不住,用括号 (2)长表达式,多用括号, (3)易懂、易读 综上所述,我们可以改写为以下表达式,使得可读性增强: (year%4 == 0) && (year%100 != 0) || (year%400 == 0) */ fmt.Printf("判断%d年是否是闰年,结果为%t ", year, (year%4 == 0) && (year%100 != 0) || (year%400 == 0)) }