以下代码输出什么?

package main

import (
    "fmt"
)

func main() {
    var ans float64 = 15 + 25 + 5.2
    fmt.Println(ans)
}
  • A:不能编译;
  • B:45;
  • C:45.2;
  • D:45.0

C 在线运行

解析

1. 常量表达式

  • 常量表达式是指仅包含常量操作数,且在编译时进行计算的表达式。
  • 常量可以是:
    • 无类型常量(untyped constants):例如 125.2
    • 有类型常量(typed constants):例如 const b int8 = 3
    • 字面值常量:例如 125.2
    • 具名常量:例如 const a = 1 + 2

2. 无类型常量的默认类型

  • 无类型常量虽然没有明确的类型,但它们有一个默认类型:
    • 整数型字面量(如 1525)的默认类型是 int
    • 浮点数字面量(如 5.2)的默认类型是 float64
    • 字符串字面量的默认类型是 string
    • 布尔字面量的默认类型是 bool
    • 复数字面量的默认类型是 complex128

3. 类型推断

  • Go 语言支持类型推断。如果上下文没有明确的类型,编译器会将无类型常量视为其默认类型。
  • 在常量表达式中,如果操作数包含不同类型的无类型常量,结果会按照以下优先级推断类型:
    • 整数 < rune < 浮点数 < 复数。

4. 题目中的常量表达式

var ans float64 = 15 + 25 + 5.2
  • 1525 是无类型整数常量,默认类型是 int
  • 5.2 是无类型浮点数常量,默认类型是 float64
  • 在常量表达式中,由于 5.2 是浮点数常量,整个表达式的结果会被推断为浮点数类型(float64)。

运算过程

  • 15 + 25 的结果是 40,仍然是无类型整数常量。
  • 40 + 5.2 的结果是 45.2,由于 5.2 是浮点数常量,整个表达式的结果被推断为 float64 类型。

赋值与输出

  • 最终结果 45.2 被赋值给变量 ans,其类型为 float64
  • fmt.Println(ans) 输出 45.2