Carbon变量与常量 #
一、变量概述 #
Carbon是静态类型语言,变量必须声明类型或能被编译器推断。变量是存储数据的命名容器,可以在程序运行时修改。
二、变量声明 #
2.1 基本语法 #
使用 var 关键字声明变量:
carbon
var name: String = "Carbon";
var age: i32 = 25;
var pi: f64 = 3.14159;
2.2 类型推断 #
Carbon支持类型推断,可以省略类型声明:
carbon
var x = 42; // 推断为 i32
var y = 3.14; // 推断为 f64
var z = "Hello"; // 推断为 String
var flag = true; // 推断为 bool
2.3 延迟初始化 #
变量可以先声明后初始化:
carbon
var x: i32;
x = 42;
// 但必须在首次使用前初始化
Print("{0}", x);
2.4 变量修改 #
var 声明的变量可以修改:
carbon
var count: i32 = 0;
count = 10;
count = count + 5;
Print("{0}", count); // 输出: 15
三、常量声明 #
3.1 使用let #
使用 let 声明不可变值:
carbon
let MaxSize: i32 = 100;
let Pi: f64 = 3.14159265359;
let AppName: String = "MyApp";
3.2 常量不可修改 #
carbon
let x: i32 = 42;
x = 100; // 编译错误:常量不能修改
3.3 编译时常量 #
某些常量可以在编译时计算:
carbon
let BufferSize: i32 = 1024 * 4;
let MaxItems: i32 = 100;
四、变量命名 #
4.1 命名规则 #
- 以字母或下划线开头
- 后续可以是字母、数字或下划线
- 区分大小写
carbon
// 有效命名
user_name
total_count
_private_var
__internal__
// 无效命名
123var // 不能以数字开头
my-var // 不能包含连字符
4.2 命名约定 #
| 类型 | 约定 | 示例 |
|---|---|---|
| 局部变量 | snake_case | user_name |
| 成员变量 | snake_case_ | name_ |
| 常量 | PascalCase | MaxSize |
| 参数 | snake_case | input_value |
4.3 语义化命名 #
carbon
// 好的命名
var user_count: i32 = 100;
var is_active: bool = true;
var total_price: f64 = 99.99;
// 避免的命名
var x: i32 = 100;
var flag: bool = true;
var tp: f64 = 99.99;
五、作用域 #
5.1 块作用域 #
变量在声明它的块内有效:
carbon
fn Example() -> i32 {
var x: i32 = 10;
{
var y: i32 = 20;
Print("{0}, {1}", x, y); // x和y都可见
}
Print("{0}", x); // x可见
// Print("{0}", y); // 错误:y不可见
return x;
}
5.2 变量遮蔽 #
内部块可以声明同名变量:
carbon
fn Example() -> i32 {
var x: i32 = 10;
{
var x: i32 = 20; // 遮蔽外部的x
Print("{0}", x); // 输出: 20
}
Print("{0}", x); // 输出: 10
return 0;
}
5.3 函数参数作用域 #
carbon
fn Add(a: i32, b: i32) -> i32 {
// a和b在整个函数内有效
var result: i32 = a + b;
return result;
}
六、初始化 #
6.1 默认初始化 #
Carbon不提供默认初始化,变量必须显式初始化:
carbon
var x: i32; // 未初始化,使用前必须赋值
x = 42;
Print("{0}", x);
6.2 初始化表达式 #
carbon
var a: i32 = 10;
var b: i32 = a + 5;
var c: i32 = Add(a, b);
6.3 列表初始化 #
carbon
var arr: [i32; 3] = (1, 2, 3);
var tuple: (i32, String) = (42, "Hello");
七、类型注解 #
7.1 显式类型 #
carbon
var x: i32 = 42;
var y: f64 = 3.14;
var z: String = "Hello";
7.2 auto类型 #
使用 auto 让编译器推断类型:
carbon
var x: auto = 42; // i32
var y: auto = 3.14; // f64
var z: auto = "Hello"; // String
7.3 类型一致性 #
carbon
var x: i32 = 42;
var y: i32 = x; // 类型一致
// var z: String = x; // 错误:类型不匹配
八、变量生命周期 #
8.1 局部变量 #
局部变量在块结束时销毁:
carbon
fn Example() -> i32 {
var x: i32 = 42; // x创建
{
var y: i32 = 10; // y创建
} // y销毁
return x;
} // x销毁
8.2 所有权 #
Carbon采用所有权系统管理资源:
carbon
fn Example() -> i32 {
var s: String = "Hello"; // s拥有字符串
var t: String = s; // 所有权转移给t
// s不再有效
Print("{0}", t);
return 0;
}
九、最佳实践 #
9.1 优先使用let #
carbon
// 优先使用let
let MaxRetry: i32 = 3;
let DefaultPort: i32 = 8080;
// 只在需要修改时使用var
var counter: i32 = 0;
counter += 1;
9.2 就近声明 #
carbon
// 好的做法:就近声明
fn Process(data: [i32]) -> i32 {
var sum: i32 = 0;
for (item in data) {
sum += item;
}
return sum;
}
// 避免:提前声明
fn Process(data: [i32]) -> i32 {
var sum: i32;
var i: i32;
// ... 很多代码
sum = 0;
// ...
return sum;
}
9.3 有意义的初始化 #
carbon
// 好的做法
var count: i32 = 0;
var name: String = "";
var found: bool = false;
// 避免
var count: i32;
var name: String;
var found: bool;
十、常见错误 #
10.1 未初始化 #
carbon
var x: i32;
Print("{0}", x); // 错误:使用未初始化的变量
10.2 类型不匹配 #
carbon
var x: i32 = "Hello"; // 错误:字符串不能赋值给整数
10.3 修改常量 #
carbon
let x: i32 = 42;
x = 100; // 错误:常量不能修改
10.4 作用域错误 #
carbon
fn Example() -> i32 {
{
var x: i32 = 10;
}
Print("{0}", x); // 错误:x不在作用域内
return 0;
}
十一、总结 #
本章我们学习了:
- 变量声明:使用var声明可变变量
- 常量声明:使用let声明不可变值
- 类型推断:自动推断变量类型
- 作用域:块作用域、变量遮蔽
- 命名约定:snake_case、PascalCase
- 最佳实践:优先使用let、就近声明
接下来让我们学习Carbon的基本数据类型!
最后更新:2026-03-27