Skip to content

Latest commit

 

History

History
197 lines (169 loc) · 5.82 KB

8.expression.md

File metadata and controls

197 lines (169 loc) · 5.82 KB

表达式与运算符

表达式是编程语言中的句法实体,可以对其进行计算以确定其值。 表达式可以是单个变量或常量,也可以是多个常量、变量、函数、操作符的组合。表达式计算的结果可能是任何类型。

运算符

运算符是指定要在表达式中执行的计算类型的标志或符号。有算术运算符、关系运算符、逻辑运算符、位运算、赋值运算符 等多种形式。运算符会针对一个以上操作数项目来进行运算。例如表达式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)