Golang基础--一篇文章记住操作符的所有用法

本文比较简单,主要介绍在golang里面操作符(加减乘除以及取模)的几个要注意的点。

速记

  1. 如果除法两个操作数都是整数,则结果也是整数。
  2. %取模运算符的结果没有float类型,正负号只与第一个操作数一致。
  3. %取模运算操作数有类型限制。
  4. 除此之外的运算符合并无特殊。

详细分析

运算结果

  1. 加减乘结果都与实际人为计算一致。
  2. 除法运算符有点特殊,如果除法两个操作数都是整数,则结果也是整数。比如5/4 结果并不是1.25,而是1,这与我们人为计算是不一致的。
  3. %取模运算符的结果没有float类型,正负号只与第一个操作数一致,5%4,5%-4都是正数,-5%4,-5%-4都是负数。

操作数类型限制(适用于加减乘除运算符)

  1. %取模运算仅能用于整数,无论这两个操作数是不是变量还是常量。
  2. 如果两个操作数都是常量,则没有任何要求。
  3. 如果两个操作数都是变量,则这两个操作数类型必须一致。
  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