V语言04语句表达式
如
a := 10
b := 20
if a < b {println("$a < $b")
} else if a > b {println("$a > $b")
} else {println("$a == $b")
}
注意:没有括号
,且{}
是必须的.如
可用作表达式返回值.
num := 777
s := if num % 2 == 0 { "even" } else { "odd" }
println(s)
// "odd",真难受.一个`?:`不就行了
用is
及其否定!is
来检查类型.
struct Abc {val string
}struct Xyz {foo string
}type Alphabet = Abc | Xyzx := Alphabet(Abc{"test"}) //就是变量.
if x is Abc {// x自动转为Abc,可在此用println(x)
}
if x !is Abc {println("非Abc")
}
或用匹配
.
match x {Abc {//x自动转为Abcprintln(x)}Xyz {//x自动转为Xyzprintln(x)}
}
构
也可以:
struct MyStruct {x int
}struct MyStruct2 {y string
}type MySumType = MyStruct | MyStruct2struct Abc {bar MySumType
}//两个都可以x := Abc{bar: MyStruct{123} //MyStruct自动转为MySumType
}
if x.bar is MyStruct {// x.bar自动转println(x.bar)
}
match x.bar {MyStruct {// x.bar自动转println(x.bar)}else {}
}
转换
可能不安全
,但有用.用mut
标记表达式
,表明程序员
懂得起.
mut x := MySumType(MyStruct{123})
if mut x is MyStruct {//即使x可变,x转为MyStruct,无mut不行println(x)
}
//匹配也一样
match mut x {//即使x可变,x转为MyStruct,无mut不行MyStruct {println(x)}
}
in
检查是否在数组/映射
.!in
表不在.
nums := [1, 2, 3]
println(1 in nums) // 真
println(4 !in nums) // 真
m := map{"one": 1"two": 2
}
println("one" in m) // 真
println("three" !in m) // 真
在布尔
表达式中更清晰/紧凑
.
enum Token {plusminusdivmult
}struct Parser {token Token
}parser := Parser{}
if parser.token == .plus || parser.token == .minus || parser.token == .div || parser.token == .mult {//太丑陋.优化成下面了,无数组// ...
}
if parser.token in [.plus, .minus, .div, .mult] {//这样.// ...
}//应该
V
只有一个带多种形式的for
循环关键字.
for/in
.与数组/映射/区间
一起用.
numbers := [1, 2, 3, 4, 5]
for num in numbers {println(num)
}
names := ["Sam", "Peter"]
for i, name in names {println("$i) $name")// 输出:0) Sam// 1) Peter
}
//上面为只读,下面可变.
mut numbers := [0, 1, 2]
for mut num in numbers {num++
}
println(numbers) // [1, 2, 3]
_
则忽略掉了.映射版:
m := map{"one": 1"two": 2
}
for key, value in m {println("$key -> $value")// 输出: one -> 1// two -> 2
}
键值用_
来表示忽略.
m := map{"one": 1"two": 2
}
//迭代键
for key, _ in m {println(key)// Output: one// two
}
//迭代值
for _, value in m {println(value)// Output: 1// 2
}
for i in 0 .. 5 {print(i)
}//迭代区间
低..高
区间,为[)
左闭右开.
mut sum := 0
mut i := 0
for i <= 100 {//相当于(当while)了.sum += ii++
}
println(sum) // "5050"
类似当/while
,不满足条件则退出.必须无()
有{}
.
mut num := 0
for {num += 2if num >= 10 {break}
}//类似(当1{})
println(num) // "10"
C风格
,
for i := 0; i < 10; i += 2 {// 不打印6if i == 6 {continue}println(i)
}//这里(i)不必为`mut`,按定义,总是`可变`的
比当
好,因为当
容易忘记更新记数器
,从而死循环.
断/下
控制流程,后可接标签
.
outer: for i := 4; true; i++ {println(i)for {if i < 7 {continue outer} else {break outer}}
}
标签
必须紧接外部循环
.
匹配:
os := "windows"
print("V运行在")
match os {"darwin" { println("macOS.") }"linux" { println("Linux.") }else { println(os) }
}
匹配就是多个如异如异
.找到分支
运行相应块,找不到,运行异
块.
number := 2
s := match number {1 { "one" }2 { "two" }else { "many" }
}
匹配表达式,返回匹配分支的最后表达式.
enum Color {redbluegreen
}fn is_red_or_blue(c Color) bool {return match c {.red,.blue{true}//逗号表示匹配多个值.green { false }}
}
也可匹配
枚举变量,用.枚举项
来简写,当分支填满了时,不能用异
.
c := `v`
typ := match c {`0`...`9` { "digit" }`A`...`Z` { "uppercase" }`a`...`z` { "lowercase" }else { "other" }
}//严重抄袭D,D这里为`..`.
println(typ)
// "lowercase"
这里区间,用...
来表示左闭右闭
都包含的意思.匹配
中用..
报编译错误.在for
循环与if
语句中不能用匹配
表达式.
延时语句,
import osfn read_log() {mut ok := falsemut f := os.open("log.txt") or { panic(err.msg) }defer {f.close()}// ...if !ok {//在此执行延时.return}// ...//这里执行延时语句
}//类似`D`的`域(成功)`.
函数返回值,则在求值中语句
后执行延时
.
import osenum State {normalwrite_logreturn_error
}//写日志文件,并返回已写字节数
fn write_log(s State) ?int {mut f := os.create("log.txt") ?defer {f.close()}if s == .write_log {// `f.close()`在`f.write()`后执行//但在返回给`主`函数前执行return f.writeln("这是日志文件")}else if s == .return_error {//在错误()后,报告仍是打开return error("未写;打开文件: $f.is_opened")}//分支return 0
}fn main() {n := write_log(.return_error) or {println("错误: $err")0}println("已写$n字节")
}
V语言04语句表达式相关推荐
- 【嵌入式】C语言高级编程-语句表达式(03)
00. 目录 文章目录 00. 目录 01. C语言的表达式 02. C语言的语句 03. C语言中的代码块 04. C语言中的语句表达式 05. 宏中使用语句表达式 06. Linux内核应用示例 ...
- C程序设计语言现代方法04:表达式
目录 1. 算术运算符 1.1 运算符的优先级和结合性 1.2 运算符/ 和 %的注意事项 2. 赋值运算符 3. 自增 & 自减运算符 4. 子表达式的求值顺序 5. 顺序点 6. 运算符和 ...
- java任何表达式都可以当作语句_在Java语言中语句用分号终止,并不是所有的表达式都可以构成语句...
在Java语言中,语句以分号":"作为结束标志.块语句由其他语句组成,其本身不需要用分号结尾.另外,内嵌有块语句并以块语句结尾的语句,也不需要用分号结尾. Java语句可分为空语句 ...
- c语言长度宏定义运算符,C语言在宏定义中使用语句表达式和预处理器运算符
语句表达式的亮点在于定义复杂功能的宏.使用语句表达式来定义宏,不仅可以实现复杂的功能,而且还能避免宏定义带来的歧义和漏洞.下面以一个简单的最小值的宏为例子一步步说明. 1.灰常简单的么,使用条件运算符 ...
- 【C语言语法】表达式与语句的区别与联系
在看题解的时候发现了这样一句话: if(sum>=n)sum-=(l*l),l++; 这里的两个赋值表达式竟然可以用逗号分隔.这样就只需要一个分号,可以不加大括号了,太舒服了,因为我个人写代 ...
- c语言中循环体表达式,C语言的循环语句
循环语句是用于重复执行某条语句(循环体)的语句,它包含一个控制表达式,每循环执行一次都要对控制表达式进行判断,如果表达式为真,则继续执行循环.C语言提供了3中循环语句,分别为while语句,do wh ...
- c语言for表达式1的作用,C语言for语句用法详解
C语言for语句用法详解 C语言是一门高级计算机编程语言,设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言.下面小编给大家介绍C语言f ...
- c语言if语句条件是字母,C语言的if语句中,用作判断的条件表达式为()
语言的语句用作中国传统的为政之道一开始是诉诸于礼治的.() 在美国现役部队当中有10%的将军和20%的校官.判断尉官都是来自美国后备役军官训练团.() 司马光认为,条达式用人之术,与其用小人,不如用愚 ...
- 计算机c语言循环作业,计算机C语言循环语句的应用研究
[摘要]基于计算机C语言循环语句的应用分析,首先要明确C语言应用现状,然后阐述C语言循环语句的分类及特点,最后详细论述循环语句的应用要点,针对while循环语句.dowhile循环语句.for循环语句 ...
最新文章
- Leptonica在VS2010中的编译及简单使用举例
- Update of SharePoint Me
- git简介 http://msysgit.github.io/
- NYOJ 23 取石子
- 在xml文件中使用typeAliases标签报错The content of element type “configuration“ must match “(properties?,setting
- 微服务为什么离不开spring cloud?
- LaTeX:equation, aligned 书写公式换行,顶部对齐
- 基于Opencv--图像上采样
- java 蓝桥杯算法训练 纪念品分组(题解)
- windows7.0旗舰版安装后控制面板自带的Microsoft程序
- PCL——1.介绍及工程创建与测试
- Android 实现圆角头像(使用第三方开源库)
- ps缩略图补丁 安装一次之后 失效,卸载重新安装提示这个,是什么原因
- matlab三维作图知识点
- oracle创建数据库实例
- 注册表怎么禁用计算机,如何禁用注册表,注册表禁用和启动的方法
- 【测试】11月11日的测试
- J9数字论:关于区块链的那些专业术语
- DSM-830源网荷系统控制终端(源网荷智能互动终端)-新型电力负荷控制终端(电力负荷管理终端装置)-互动式需求侧管理终端-专变采集终端的功能。DSM-830交互式需求侧管理终端(需求侧管理互动式终端
- 【微信小程序】圆环进度条
热门文章
- Mssql2k之数据库管理
- [ISCC 2021]部分wp
- 02 数字图像技术——颜色空间转换与颜色空间分割实验结果与分析——python
- 终于鸿蒙微内核弄懂了-程序员和鼓励师的合作
- 解决SQL Server占用服务器内存过高问题
- 神经网络整合算法是什么,神经网络整合算法实例
- 图标照旧的效果_这不是而且不能成为“一切照旧”
- 项目计划表格甘特图_项目管理:什么是甘特图?
- NIFI源码学习-(五、3)NIFI集群的FlowFile负载均衡实现-FlowFile传递
- 「分辨率比拼」还不够,4D成像雷达进入“软”竞争时代