Golang基础--一篇文章记住操作符的所有用法
本文比较简单,主要介绍在golang里面操作符(加减乘除以及取模)的几个要注意的点。
速记
- 如果除法两个操作数都是整数,则结果也是整数。
- %取模运算符的结果没有float类型,正负号只与第一个操作数一致。
- %取模运算操作数有类型限制。
- 除此之外的运算符合并无特殊。
详细分析
运算结果
- 加减乘结果都与实际人为计算一致。
- 除法运算符有点特殊,如果除法两个操作数都是整数,则结果也是整数。比如5/4 结果并不是1.25,而是1,这与我们人为计算是不一致的。
- %取模运算符的结果没有float类型,正负号只与第一个操作数一致,5%4,5%-4都是正数,-5%4,-5%-4都是负数。
操作数类型限制(适用于加减乘除运算符)
- %取模运算仅能用于整数,无论这两个操作数是不是变量还是常量。
- 如果两个操作数都是常量,则没有任何要求。
- 如果两个操作数都是变量,则这两个操作数类型必须一致。
- 如果两个操作数一个是变量,一个是常量,只有一种情况是不允许的,就是常量是float,而变量是整型值,则会提示 constant float_var truncated to integer 。这是个编译器给到的提示。为什么变量是float,常量是整型值就可以,换下就不行呢?问题就在于编译器在编译期间是确定的知道常量是float无法转成int的(因为精度会丢失的),所以它阻止你这样做。而float变量,编译器不知道它不能表示为整数。所以让你通过。在glang的规范里有相关规定:
The values of typed constants must always be accurately representable as values of the constant type.(类型常量的值必须始终能够准确地表示为常量类型的值)
When converting a floating-point number to an integer, the fraction is discarded (truncation towards zero). (将浮点数转换为整数时,小数部分将被丢弃(向零截断)).
除此之外都是可以直接计算的。
1package main
2
3import (
4 "fmt"
5)
6
7func main() {
8 fmt.Printf("除法--两个操作数都是整型\n")
9 fmt.Printf("%T,%[1]v\n",5/4)
10 fmt.Printf("%T,%[1]v\n",5/-4)
11 fmt.Printf("%T,%[1]v\n",-5/4)
12 fmt.Printf("%T,%[1]v\n",-5/-4)
13 fmt.Printf("除法--有操作数是浮点型\n")
14 fmt.Printf("%T,%[1]v\n",5/1.4)
15 fmt.Printf("%T,%[1]v\n",5.1/4)
16 fmt.Printf("%T,%[1]v\n",5.1/1.4)
17 fmt.Printf("取模--两个操作数都是整型\n")
18 fmt.Printf("%T,%[1]v\n",5%4)
19 fmt.Printf("%T,%[1]v\n",5%-4)
20 fmt.Printf("%T,%[1]v\n",-5%4)
21 fmt.Printf("%T,%[1]v\n",-5%-4)
22 fmt.Printf("取模--有操作数是浮点型\n")
23 //fmt.Printf("%T,%[1]v",5%1.4) //illegal constant expression: floating-point % operation
24 //fmt.Printf("%T,%[1]v",5.1%4) //illegal constant expression: floating-point % operation
25 //fmt.Printf("%T,%[1]v",5.1%1.4) //illegal constant expression: floating-point % operation
26 fmt.Printf("--------------变量测试-------------\n")
27 a,b,c,d := 5,5.1,4,1.4
28 a1,b1,c1,d1 := -5,-5.1,-4,-1.4
29 fmt.Printf("除法--两个操作数都是整型变量\n")
30 fmt.Printf("%T,%[1]v\n",a/c)
31 fmt.Printf("%T,%[1]v\n",a/c1)
32 fmt.Printf("%T,%[1]v\n",a1/c)
33 fmt.Printf("%T,%[1]v\n",a1/c1)
34 fmt.Printf("除法--两个操作数都是变量(int and float)\n")
35 //fmt.Printf("%T,%[1]v\n",a/d) //invalid operation: a / d (mismatched types int and float64)
36 //fmt.Printf("%T,%[1]v\n",b/c) //invalid operation: b / c (mismatched types float64 and int)
37 fmt.Printf("%T,%[1]v\n",b/d)
38
39 fmt.Printf("取模--两个操作数都是整型变量\n")
40 fmt.Printf("%T,%[1]v\n",a%c)
41 fmt.Printf("%T,%[1]v\n",a%c1)
42 fmt.Printf("%T,%[1]v\n",a1%c)
43 fmt.Printf("%T,%[1]v\n",a1%c1)
44 fmt.Printf("除法--两个操作数都是变量(int and float)\n")
45 //fmt.Printf("%T,%[1]v",a%d) //invalid operation: a % d (mismatched types int and float64)
46 //fmt.Printf("%T,%[1]v",b%c) //invalid operation: b % c (mismatched types float64 and int)
47 //fmt.Printf("%T,%[1]v",b%d) //invalid operation: b % d (operator % not defined on float64)
48 fmt.Printf("除法--一个操作数都是变量(int or float),另一个是常量(int or float)\n")
49 //fmt.Printf("%T,%[1]v\n",a/1.4) //constant 1.4 truncated to integer
50 fmt.Printf("%T,%[1]v\n",a/4)
51 fmt.Printf("%T,%[1]v\n",5/d)
52 fmt.Printf("%T,%[1]v\n",5/c)
53 fmt.Printf("%T,%[1]v\n",b/1.4)
54 fmt.Printf("%T,%[1]v\n",b/4)
55 fmt.Printf("%T,%[1]v\n",5.1/d)
56 //fmt.Printf("%T,%[1]v\n",5.1/c) //constant 5.1 truncated to integer
57
58 //fmt.Printf("%T,%[1]v\n",a/(-1.4)) //constant 1.4 truncated to integer
59 fmt.Printf("%T,%[1]v\n",a1/4)
60 fmt.Printf("%T,%[1]v\n",5/d1)
61 fmt.Printf("%T,%[1]v\n",-5/c)
62 fmt.Printf("%T,%[1]v\n",b/(-1.4))
63 fmt.Printf("%T,%[1]v\n",b1/4)
64 fmt.Printf("%T,%[1]v\n",(-5.1)/d1)
65 //fmt.Printf("%T,%[1]v\n",5.1/c) //constant 5.1 truncated to integer
66}
输出结果:
1除法--两个操作数都是整型
2int,1
3int,-1
4int,-1
5int,1
6除法--有操作数是浮点型
7float64,3.5714285714285716
8float64,1.275
9float64,3.642857142857143
10取模--两个操作数都是整型
11int,1
12int,1
13int,-1
14int,-1
15取模--有操作数是浮点型
16--------------变量测试-------------
17除法--两个操作数都是整型变量
18int,1
19int,-1
20int,-1
21int,1
22除法--两个操作数都是变量(int and float)
23float64,3.642857142857143
24取模--两个操作数都是整型变量
25int,1
26int,1
27int,-1
28int,-1
29除法--两个操作数都是变量(int and float)
30除法--一个操作数都是变量(int or float),另一个是常量(int or float)
31int,1
32float64,3.5714285714285716
33int,1
34float64,3.642857142857143
35float64,1.275
36float64,3.642857142857143
37int,-1
38float64,-3.5714285714285716
39int,-1
40float64,-3.642857142857143
41float64,-1.275
42float64,3.642857142857143