注册 登录

清河洛

V语言中的数据类型与变量和常量

qingheluo2023-03-05清河洛536
数据类型共有20个基本类型布尔类型(Boolean):bool字符串(String):string整数(Integer): 有符号整数: i8、i16、i32 、i64、i128(目前不支持,后期有计划支持) 无符号整数: u8、u16、u32、u64、u128(目前不支持,后期有计划支持) 别名: byte(u8)、 int(i32)、 rune(i32,表示Unicode代码点) 与C和Go不同, V语言中**int始终是32位**整数 isize, usize:引用内存中任何位置所需的字节数,大小取决去平台 voidptr:主要用于和C互操作 any:泛型,类似于Go中的i...

数据类型

共有20个基本类型

布尔类型(Boolean):bool

字符串(String):string

整数(Integer):

有符号整数: i8、i16、i32 、i64、i128(目前不支持,后期有计划支持)
无符号整数: u8、u16、u32、u64、u128(目前不支持,后期有计划支持)
别名: byte(u8)、 int(i32)、 rune(i32,表示Unicode代码点)
    与C和Go不同, V语言中**int始终是32位**整数
isize, usize:引用内存中任何位置所需的字节数,大小取决去平台
voidptr:主要用于和C互操作
any:泛型,类似于Go中的interface{}和C中的void*

浮点数(Float):f32(小数位最大5位)、f64(小数位最大15位)

精度提升

由于所有运算符两边的值类型必须相同。

在数值运算中,如果运算符两边的数值精度不同,小精度类型会自动提升为大精度类型

   i8 → i16 → int → i64
                ↘     ↘
                  f32 → f64
                ↗     ↗
   u8 → u16 → u32 → u64 ⬎
      ↘    ↘    ↘        ptr
   i8 → i16 → int → i64 ⬏

i := i16(10)
v := 13          // v类型自动推断为i32
v := 13 + i      // 由于i为i16,自动推断13为i16也合理,v的类型为u16,没有提升
v := i64(13) + i // 由于i64(13)存在,i自动提升为i64类型

f := f32(3.14)

v := 3.123456    // v类型自动推断为f64(小数位超过了5位)
v := 3.123456 + f  // 由于f为f32,自动推断3.123456为f32不合理
                   // 则继续自动推断为f64,f自动提升为f64

变量

使用冒号等(:=)来声明和初始化变量,这也是V语言中声明变量的唯一方法,这意味着变量始终具有初始值

name := 'sanqian'
age := 33

变量的类型是从右侧的值自动推断出来的

要强制指定类型需使用类型转换:Type(v) 将值v转换为类型Type

age := 33       // i32类型
age := i64(33)  // i64类型

变量的可变性:在V语言中,变量默认是不可变的,如果一个变量可能发生值的改变,在声明设个变量时需要使用关键字mut(后续版本可能改为var)

age := 33
age = 30 // 变量不可变,会报错

mut age := 33
age = 30 // 使用了mut关键字,变量可变

可以在一行中更改多个变量的值。 通过这种方式,可以在没有中间变量的情况下交换变量值

a,b,c = b,c,a

空白标识符(_):被用于抛弃值

a , _ , b = 3,4,5
会抛弃值4,把3赋值给变量a,把5赋值给变量b

实际上空白标识符(_)是一个只写变量,只能赋值但不能获取它的值

空白标识符最常见的用途就是根据一个函数的返回值对变量赋值时抛弃某些值,因为当函数返回多个值时必须都被接受,但有时并不需要使用从一个函数得到的所有返回值

变量未使用:如果一个变量声明后没有使用,编译器将警告尚未使用该变量,在编译时使用-prod选项会导致编译失败(一般用于生产模式)

数据类型转换

Type(v):仅适用于同类型数据转换,如同为数值类型的i32转为i64或f32等

v.Type():适用于所有类型之间的转换,一个特殊的就是string用str表示

字符串转换为数值时会从左至右依次转换,在碰到第一个不能转换字符后终止

a := 'a12'
b := '12a34'
v := a.int() // 由于字符串第一个为a,不能转换为数值,v会转换为int的默认值0
v := b.int() // 在遇到字符a后停止转换,后面的34不会转换,v会转换为int类型的12

仅字符串可以转换布尔值,仅'true'转换为true,且区分大小写,任何字符大写都转换为false,其余所有字符串接转换为false

全局变量

V语言中没有全局变量,与大多数其他语言不同,V语言只允许在函数中定义变量,不允许使用全局变量

如果非要使用全局变量,可以使用__global()语句,并且在编译运行时指定-enable-globals选项

__global(
    name = 'sanqian'
    age = 33
    height int
)
fn main(){
    age = 35
    print('年龄 $age,身高 $height')
}

运行命令:v -enable-globals run demo.v
输出内容:年龄 35,身高 0
可以看出:
    1.声明时直接用等号(=)而不是冒号等(:=)
    2.值时可变的
    2.声明时可以不指定初始值,只指定变量类型,该变量的初始值为该类型的默认初始值

常量

使用关键字const关键字来声明常量

常量只能在全局中声明,不可在函数中声明

常量一经声明,任何时候都不可修改

常量名称必须使用大驼峰写法(PascalCase)(首字母必须大写)来命名

V语言中没有全局变量,常量会经常使用



网址导航