第2篇:数据与类型——仓颉的基础数据类型

**作者:**中文编程倡导者—— 李金雨
联系方式: wbtm2718@qq.com
**目标读者:**编程入门(零基础)
核心理念: 使用华为仓颉原生中文编程,体验真正的国产编程语言


一、开篇引入

1.1 生活中的"数据"

想象你要介绍自己,你会说什么?

  • 我叫张三(文字)
  • 我今年15岁(整数)
  • 我身高1.75米(小数)
  • 我是学生(是/否)

这些都是数据——用来描述事物的信息。

1.2 程序中的"数据盒子"

上一节课,我们写了这样的代码:

let 姓名 = "张三"
let 年龄 = 15

这里的姓名年龄就是数据盒子(变量),我们用来存放信息。

1.3 关于类型声明的思考

在这里,我们又要提到那个让人纠结的语法设计问题了。

仓颉的语法是:

let 年龄: Int64 = 15

按照我们中国人的思维习惯,应该是:

  • 整数类型的年龄等于15
  • 字符串类型的姓名等于"张三"

但仓颉的写法是"年龄 整数类型的",这就像是说"苹果 红色的",而不是"红色的苹果"。

如果仓颉能像C#那样设计:

// 设想中的更符合中国人习惯的语法
Int64 年龄 = 15        // 整数类型 年龄 = 15
String 姓名 = "张三"   // 字符串类型 姓名 = "张三"

这样读起来就顺畅多了!先知道是什么类型,再看叫什么名字,最后看值是什么——完全符合我们的思维习惯。

不过,既然仓颉目前采用的是类型后置的设计,我们就先适应它。也许未来的版本会改进呢!

1.4 本课目标

今天我们要学习:

  1. 仓颉的基本数据类型
  2. 如何创建数据盒子
  3. 如何使用不同类型的数据
  4. 做一个个人信息档案程序

二、概念讲解

2.1 数据盒子(变量)

什么是数据盒子?

想象你有一个储物柜,里面有很多盒子,每个盒子上贴着标签:

┌─────────────┐
│  玩具盒子   │  → 里面装玩具
├─────────────┤
│  书本盒子   │  → 里面装书本
├─────────────┤
│  文具盒子   │  → 里面装文具
└─────────────┘

在编程中,数据盒子就像是这些贴标签的盒子,用来存放数据。

创建数据盒子
let 名字: String = "张三"
部分 含义
let 创建一个数据盒子
名字 盒子的标签(名称)
: 分隔符
String 盒子的类型(只能装字符串)
= 把数据放进盒子
"张三" 具体的数据

再次吐槽一下语法

我们中国人习惯说"字符串类型的名字",但仓颉的写法是"名字 字符串类型的"(名字: String)。

这就像:

  • 我们习惯说:“红色的苹果”
  • 仓颉的写法像是:“苹果 红色的

虽然不影响使用,但确实不太符合我们的语言习惯。希望华为能在未来版本中改进!

2.2 仓颉的基本数据类型

类型1:整数(Int64、Int32等)——装整数的盒子

用来存储年龄、人数、分数等整数信息。

let 年龄: Int64 = 15           // 整数
let 班级人数: Int32 = 50       // 整数
let 分数: Int64 = 95           // 整数
let 负数: Int64 = -10          // 负数也可以

整数类型的区别

类型 范围 说明
Int8 -128 ~ 127 很小的整数
Int16 -32768 ~ 32767 小整数
Int32 约-21亿 ~ 21亿 普通整数
Int64 很大很大 大整数

生活例子

  • 你的年龄:15(Int8就够了)
  • 中国人口:14亿(需要Int64)
  • 考试分数:100(Int8就够了)
类型2:小数(Float64、Float32)——装小数的盒子

用来存储身高、体重、价格、成绩等带小数点的数。

let 身高: Float64 = 1.75       // 小数
let 体重: Float64 = 60.5       // 小数
let 圆周率: Float64 = 3.14159  // 小数
let 温度: Float64 = -5.5       // 负数也可以

注意:小数在计算机里叫"浮点数",所以类型名是Float。

类型3:文字(String、Char)——装文字的盒子

用来存储名字、地址、句子、文章内容等文字信息。

let 姓名: String = "张三"              // 字符串(多个字符)
let 性别: Char = '男'                  // 字符(单个字符)
let 地址: String = "北京市海淀区"       // 字符串
let 空字符串: String = ""              // 空的字符串

String和Char的区别

  • String:一串文字,用双引号 "..."
  • Char:单个字符,用单引号 '...'
类型4:真假(Bool)——装"是/否"的盒子

只有两种可能的值:true(真/是)或 false(假/否)

let 是否学生: Bool = true
let 是否成年: Bool = false
let 是否会员: Bool = true
let 是否在线: Bool = false

生活例子

  • 你是学生吗?是(true)
  • 你成年了吗?否(false)
  • 今天下雨了吗?否(false)
  • 这个账号是VIP吗?是(true)

2.3 类型推断

仓颉很聪明,有时候你不用告诉它类型,它也能猜出来:

// 明确指定类型
let 姓名: String = "张三"

// 让仓颉自己推断类型
let 姓名 = "张三"    // 仓颉知道这是String类型
let 年龄 = 15        // 仓颉知道这是Int64类型

建议:为了代码更清晰,建议初学者还是写上类型!

2.4 关于类型声明语法的再思考

让我们再次对比一下不同的语法设计:

仓颉目前的语法(类型后置):

let 姓名: String = "张三"
let 年龄: Int64 = 15
let 身高: Float64 = 1.75
let 是否学生: Bool = true

C#风格的语法(类型前置,更符合中国人习惯):

string 姓名 = "张三";
int 年龄 = 15;
double 身高 = 1.75;
bool 是否学生 = true;

为什么类型前置更符合中国人习惯?

我们中文的语序是:修饰语在前,中心语在后

  • 美丽的花朵
  • 高大的树木
  • 红色的汽车
  • 字符串类型的变量

所以,字符串类型的 姓名姓名 字符串类型的 更符合我们的思维习惯。

建议华为

  1. 在仓颉的未来版本中,考虑支持可选的类型前置语法
  2. 或者至少提供一个语法糖,让两种写法都能用
  3. 这样既能保持与国际接轨,又能照顾中国人的使用习惯

三、动手实践

3.1 基础练习:创建个人档案

// 个人档案程序
// 作者:你的名字

main() {
    println("=== 个人档案 ===")
    
    // 基本信息
    let 姓名: String = "张三"
    let 年龄: Int64 = 15
    let 身高: Float64 = 1.75    // 单位:米
    let 体重: Float64 = 60.0    // 单位:公斤
    let 是否学生: Bool = true
    
    // 输出信息
    println("姓名:${姓名}")
    println("年龄:${年龄}岁")
    println("身高:${身高}米")
    println("体重:${体重}公斤")
    println("是否学生:${是否学生}")
    
    // 计算BMI
    let bmi: Float64 = 体重 / (身高 * 身高)
    println("BMI指数:${bmi}")
    
    // 判断体重状态
    if (bmi < 18.5) {
        println("体重状态:偏瘦")
    } else if (bmi < 24.0) {
        println("体重状态:正常")
    } else if (bmi < 28.0) {
        println("体重状态:偏胖")
    } else {
        println("体重状态:肥胖")
    }
}

3.2 进阶练习:成绩统计

// 成绩统计程序

main() {
    println("=== 成绩统计 ===")
    
    // 各科成绩
    let 语文: Int64 = 85
    let 数学: Int64 = 92
    let 英语: Int64 = 78
    let 物理: Int64 = 88
    let 化学: Int64 = 90
    
    // 计算总分
    let 总分: Int64 = 语文 + 数学 + 英语 + 物理 + 化学
    
    // 计算平均分
    let 平均分: Float64 = Float64(总分) / 5.0
    
    // 输出结果
    println("语文:${语文}分")
    println("数学:${数学}分")
    println("英语:${英语}分")
    println("物理:${物理}分")
    println("化学:${化学}分")
    println("----------------")
    println("总分:${总分}分")
    println("平均分:${平均分}分")
    
    // 判断等级
    if (平均分 >= 90) {
        println("等级:优秀")
    } else if (平均分 >= 80) {
        println("等级:良好")
    } else if (平均分 >= 70) {
        println("等级:中等")
    } else if (平均分 >= 60) {
        println("等级:及格")
    } else {
        println("等级:不及格")
    }
}

3.3 挑战练习:温度转换器

// 温度转换器

main() {
    println("=== 温度转换器 ===")
    
    // 摄氏温度
    let 摄氏温度: Float64 = 25.0
    
    // 转换为华氏温度
    // 公式:华氏 = 摄氏 × 9/5 + 32
    let 华氏温度: Float64 = 摄氏温度 * 9.0 / 5.0 + 32.0
    
    // 转换为开尔文温度
    // 公式:开尔文 = 摄氏 + 273.15
    let 开尔文温度: Float64 = 摄氏温度 + 273.15
    
    println("摄氏温度:${摄氏温度}°C")
    println("华氏温度:${华氏温度}°F")
    println("开尔文温度:${开尔文温度}K")
}

四、知识总结

4.1 核心概念回顾

  1. 数据盒子(变量):用来存储数据的容器
  2. 数据类型:告诉计算机这个盒子里能装什么类型的数据
  3. 基本类型:整数(Int64)、小数(Float64)、文字(String)、真假(Bool)

4.2 关于语法设计的总结

虽然仓颉的类型后置语法(let 姓名: String)不太符合中国人的定语前置习惯,但它也有优点:

优点:

  • 与国际主流语言(Rust、Swift、Kotlin)保持一致
  • 类型信息明确,不容易混淆
  • 有利于国际化推广

缺点:

  • 不符合中国人的语言习惯
  • 初学者需要时间适应
  • 读起来不够顺畅

建议:

  • 初学者可以先适应这种写法
  • 希望华为能在未来版本中提供类型前置的可选语法
  • 或者提供IDE支持,让两种写法都能自动转换

4.3 关键代码速查

// 整数
let 年龄: Int64 = 15

// 小数
let 身高: Float64 = 1.75

// 字符串
let 姓名: String = "张三"

// 字符
let 性别: Char = '男'

// 布尔值
let 是否学生: Bool = true

// 类型转换
let 整数: Int64 = 100
let 小数: Float64 = Float64(整数)

4.4 常见错误提醒

错误现象 原因 解决方法
类型不匹配 把文字赋给数字变量 检查类型是否对应
变量未定义 使用了没创建的变量 先用let创建变量
字符串没引号 String类型没加引号 加上""''
类型转换错误 直接赋值不同类型 使用类型转换函数

五、课后作业

5.1 巩固练习(必做)

练习1:完善个人档案

在上面的个人档案基础上,添加:

  • 学校名称
  • 班级
  • 爱好
  • 计算并显示BMI和体重状态

练习2:购物小票

制作一个购物小票程序:

  • 商品1:苹果,单价5元,数量3斤
  • 商品2:牛奶,单价8元,数量2盒
  • 商品3:面包,单价6元,数量1个
  • 计算总价

练习3:圆的计算

输入圆的半径,计算:

  • 周长(2 × π × r)
  • 面积(π × r × r)

5.2 创意编程(选做)

创意1:制作名片

制作一个电子名片,包含:

  • 姓名、职位
  • 联系方式
  • 公司/学校
  • 用字符画装饰

创意2:简单计算器

实现两个数的:

  • 加法
  • 减法
  • 乘法
  • 除法(注意除数不能为0)

5.3 下篇预习

下一篇,我们将学习数据的运算,了解如何对数据进行各种计算。预习问题:

  1. 怎么计算两个数的和、差、积、商?
  2. 怎么比较两个数的大小?
  3. 怎么判断多个条件(并且、或者)?

思考题:你觉得在编程语言设计中,应该优先考虑国际化(与国际接轨),还是优先考虑本土化(符合本国人的习惯)?能不能两者兼顾?


恭喜你完成了第2篇的学习! 🎉

现在你已经掌握了仓颉的基本数据类型。虽然类型后置的语法设计有改进空间,但一旦习惯了,写起来也很流畅。

下节课,我们将学习如何对这些数据进行运算!

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐