golang 第四章 运算符

算术运算符

正号+,负号-,加+,减-,乘-,除/,取模(取余)%,自增++,自减--,字符串相加+

func main () {
	//演示 / 的使用
	//如果运算的数都是整数,那么除后,去掉小数部分,保留整数部分
	fmt.Println(11 / 4)	    // 2

	var n1 float32 = 11 / 4
	fmt.Println(n1)	    // 2

	//如果我们希望保留小数部分,则需要有浮点数参与运算
	var n2 float32 = 11.0 / 4
	fmt.Println(n2)	    // 2.75

	// 演示  % 的使用
	// 看一个公式 a % b = a - a / b * b
	fmt.Println("10%3=", 10 % 3)    // 1
	fmt.Println("-10%3=", -10 % 3)  //  -10 - (-10) / 3 * 3 = -10 - (-9) = -1
	fmt.Println("10%-3=", 10 % -3)  // 1
	fmt.Println("-10%-3=", -10 % -3)    // -1

	// ++ 和 --的使用
	var i int = 10
	i++ // 等价 i = i + 1
	fmt.Println("i=", i)    // 11
	i-- // 等价 i = i - 1
	fmt.Println("i=", i)    // 10

	if i > 0 {
		fmt.Println("ok")
	}
}
  1. 对于除号\,整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分
  2. 对于取模%,其本质为a % b = a - a / b * b
  3. 自增++和自减--只能当作一个独立的语言使用,且只能写在变量的后面,详细看下面的例子:
func main () {
	
	//在golang中,++ 和 -- 只能独立使用.
	var i int = 8
	var a int 
	a = i++ //错误,i++只能独立使用 
	a = i-- //错误, i--只能独立使用

	if i++ > 0 {
		fmt.Println("ok")
	}

	var i int = 1
	i++
	++i // 错误,在golang没有 前++
	i-- 
	--i // 错误,在golang没有 前--
	fmt.Println("i=", i)
}

关系运算符(比较运算符)、逻辑运算符

  1. 关系运算符
    等于==,不等于!=,小于<,大于>,小于等于<=,大于等于>=
    关系表达式的结果都是bool型,即true或者false
  2. 逻辑运算符
    逻辑与(短路与)&&,逻辑或(短路或)||,逻辑非!
    逻辑与,如果第一个条件为false,则第二个条件不会判断,最终为false
    逻辑或,如果第一个条件为true,则第二个条件不会判断,最终为true
    因此,在写逻辑判断关系式的时候,尽量把计算简单的写在前面,节省计算量
//声明一个函数(测试)
func test() bool {
	fmt.Println("test....")
	return true
}

func main() {
	var i int = 10

	//短路与
	//说明 因为  i < 9 为 false ,因此后面的 test() 就不执行
	if i < 9 && test() {
		fmt.Println("ok...")
	}	//没有输出
	if i > 9 || test() {
		fmt.Println("hello...")
	}	// hello...

	//演示逻辑运算符的使用  &&
	var age int = 40
	if age > 30 && age < 50 {
		fmt.Println("ok1")
	}
	if age > 30 && age < 40 {
		fmt.Println("ok2")
	}

	//演示逻辑运算符的使用  ||

	if age > 30 || age < 50 {
		fmt.Println("ok3")
	}
	if age > 30 || age < 40 {
		fmt.Println("ok4")
	}

	//演示逻辑运算符的使用  !

	if age > 30 {
		fmt.Println("ok5")
	}
	if !(age > 30) {
		fmt.Println("ok6")
	}
}

赋值运算符、位运算符、其他运算符

  1. 赋值运算符
    赋值=,相加后赋值+=,相减后赋值-=,相乘后赋值*=,相除后赋值/=,求余后赋值%=,左移后赋值<<=,右移后赋值>>=,按位与后赋值&=,按位异或后赋值^=,按位或后赋值|=
  2. 位运算符
    按位与&,按位或|,按位异或^,左移<<,右移>>
  3. 其他运算符
    返回变量存储位置&,指针变量*

go不支持三元运算,因为go的设计理念是“一种事情有且仅有一种方法完成”

运算符优先级

运算符优先级

获取键盘输入

调用fmt包的fmt.Scanln()或者fmt.Scanf()

  1. ScanIn类似Scan,但会在换行时才停止扫描,最后一个条目必须有换行或者到达结束位置
  2. Scanf从标准输入扫描文本,根据format参数指定的格式 将成功读取的空白分隔的值 保存进传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误
func main() {
	//从控制台接收用户信息,【姓名、年龄、薪水、是否通过考试 】

	//先声明需要的变量
	var name string
	var age byte
	var sal float32
	var isPass bool

	//方式1 fmt.Scanln
	fmt.Println("请输入姓名: ")  //当程序执行到 fmt.Scanln(&name),程序会停止在这里,等待用户输入,并回车
	fmt.Scanln(&name)
	fmt.Println("请输入年龄: ")
	fmt.Scanln(&age)
	fmt.Println("请输入薪水: ")
	fmt.Scanln(&sal)
	fmt.Println("请输入是否通过考试: ")
	fmt.Scanln(&isPass)
	fmt.Printf("名字是: %v \n 年龄是: %v \n 薪水是: %v \n 是否通过考试: %v \n\n\n\n\n", name, age, sal, isPass)

	//方式2:fmt.Scanf,可以按指定的格式输入
	fmt.Println("请依次输入你的姓名、年龄、薪水、是否通过考试, 并使用空格隔开")
	fmt.Scanf("%s %d %f %t", &name, &age, &sal, &isPass)
	fmt.Printf("名字是: %v \n年龄是: %v \n 薪水是: %v \n 是否通过考试: %v \n", name, age, sal, isPass)
}

//请输入姓名:
//小弟
//请输入年龄:
//20
//请输入薪水:
//20000
//请输入是否通过考试:
//true
//名字是: 小弟
//年龄是: 20
//薪水是: 20000
//是否通过考试: true
//
//
//
//
//请依次输入你的姓名、年龄、薪水、是否通过考试, 并使用空格隔开
//小弟 21 30000 true
//名字是: 小弟
//年龄是: 21
//薪水是: 30000
//是否通过考试: true