表达式是编程语言中的句法实体,可以对其进行计算以确定其值。 表达式可以是单个变量或常量,也可以是多个常量、变量、函数、操作符的组合。表达式计算的结果可能是任何类型。
运算符是指定要在表达式中执行的计算类型的标志或符号。有算术运算符、关系运算符、逻辑运算符、位运算、赋值运算符 等多种形式。运算符会针对一个以上操作数项目来进行运算。例如表达式2+3,其操作数是2和3,而算术运算符则是"+"
运算符 描述
+ 两个操作数求和
- 从第一个操作数中减去第二个操作数
* 将两个操作数相乘
/ 将分子除以分母
% 取模
代码示例如下:
func math() {
a := 4
b := 2
fmt.Printf("a+b的结果为:%d\n", a+b)
fmt.Printf("a-b的结果为:%d\n", a-b)
fmt.Printf("a*b的结果为:%d\n", a*b)
fmt.Printf("a/b的结果为:%d\n", a/b)
}
运算符 描述 示例
== 检查两个操作数的值是否相等,如果相等,则条件为真。
!= 检查两个操作数的值是否相等,如果值不相等,则条件为真。
> 检查左操作数的值是否大于右操作数的值,如果是,则条件为真。
< 检查左操作数的值是否小于右操作数的值,如果是,则条件为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是,则条件为真。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是,则条件为真。
代码示例如下:
func relation() {
a := 4
b := 2
if a == b {
fmt.Printf("a与b相同\n")
} else {
fmt.Printf("a与b不同\n")
}
if a < b {
fmt.Printf("a小于b\n")
} else {
fmt.Printf("a大于b\n")
}
if a > b {
fmt.Printf("a大于b\n")
} else {
fmt.Printf("a小于b\n")
}
if a <= b {
fmt.Printf("a小于等于b\n")
} else {
fmt.Printf("a大于等于b\n")
}
if a >= b {
fmt.Printf("a大于等于b\n")
} else {
fmt.Printf("a小于等于b\n")
}
}
&& 逻辑AND运算符。如果两个操作数都不为零,则条件为真。
|| 逻辑OR运算符。如果两个操作数中的任何一个非零,则条件变为真。
! 逻辑非运算符。用于反转其操作数的逻辑状态。如果条件为真,则逻辑非运算符将为假。
代码示例如下:
func logic() {
a := true
b := false
if a && b {
fmt.Printf("a与b 同时为true\n")
} else {
fmt.Printf("a与b 不同时为true\n")
}
if a || b {
fmt.Printf("a与b 至少一个为true\n")
} else {
fmt.Printf("a与b 全部为false\n")
}
if !b {
fmt.Printf("取反成功\n")
} else {
fmt.Printf("取反失败\n")
}
}
运算符 描述 示例
& 如果两个操作数中都存在二进制AND运算符,则将其复制到结果。
| 二进制OR运算符复制一个位,如果它存在于任一操作数。
^ 二进制XOR运算符复制位,如果它在一个操作数中设置,但不是在两个操作数中设置。
<< 二进制左移位运算符。左操作数值向左移动由右操作数指定的位数。
>> 二进制右移运算符。左操作数值向右移动由右操作数指定位数。
代码示例如下:
func wei() {
a := 3
b := 4
fmt.Println("a & b :", a&b)
fmt.Println("a | b :", a|b)
fmt.Println("a ^ b :", a^b)
fmt.Println("^ b :", ^b)
fmt.Println("a左移1位 :", a<<1)
fmt.Println("a右移一位:", a>>1)
}
运算符 描述
= 简单赋值操作符,将值从右侧操作数分配给左侧操作数
+= 相加和赋值运算符,向左操作数添加右操作数,并将结果赋给左操作数
-= 减去和赋值运算符,从左操作数中减去右操作数,并将结果赋给左操作数
*= 乘法和赋值运算符,它将右操作数与左操作数相乘,并将结果赋给左操作数
/= 除法和赋值运算符,它用右操作数划分左操作数,并将结果分配给左操作数
%= 模数和赋值运算符,它使用两个操作数来取模,并将结果分配给左操作数
<<= 左移和赋值运算符
>>= 右移和赋值运算符
&= 按位和赋值运算符
^= 按位异或和赋值运算符
|= 按位包含OR和赋值运算符
代码示例如下:
func Assign() {
a := 3
var c int = 2
c += a // c = c+a
fmt.Println("c+=a的结果为:", c)
c -= a //c = c -a
fmt.Println("c-=a的结果为:", c)
c *= a // c = a *c
fmt.Println("c*=a的结果为:", c)
c /= a // c = c /a
fmt.Println("c/=a的结果为:", c)
}
& 返回变量的地址
* 指向变量的指针
运算符优先级确定表达式中的分组,这会影响表达式的计算方式。某些运算符比其他运算符具有更高的优先级; 例如,乘法运算符比加法运算符有更高的优先级。 例如:x = 7 + 3 * 2; 这里,计算结果x被分配13,而不是20,因为运算符 *具有比+有更的优先级,所以它首先乘以3 * 2,然后加上7。 一元运算符指具有一个操作数的运算符,其具有最高优先级。二元运算符有五个优先级。乘法运算符绑定最强,其次是加法运算符、比较运算符、&&(逻辑与),最后是 || (逻辑或)。具有最高优先级的运算符放在表的顶部,具有最低优先级的运算符出现在底部。 在表达式中,将首先计算较高优先级的运算符。
优先级 操作符
5 * / % << >> & &^
4 + - | ^
3 == != < <= > >=
2 &&
1 ||
用二进制运算解决尼姆游戏
https://go.dev/ref/spec https://en.wikipedia.org/wiki/Expression_(computer_science)