Carbon语法基础 #

一、标识符 #

1.1 命名规则 #

Carbon标识符遵循以下规则:

  • 以字母或下划线开头
  • 后续可以是字母、数字或下划线
  • 区分大小写
carbon
// 有效标识符
MyFunction
my_variable
_private_var
var123
__special__

// 无效标识符
123var       // 不能以数字开头
my-var       // 不能包含连字符
my var       // 不能包含空格

1.2 命名约定 #

类型 约定 示例
包名 PascalCase Main, MyPackage
类型 PascalCase MyClass, Person
函数 PascalCase AddNumbers, GetUser
变量 snake_case user_name, total_count
常量 PascalCase MaxSize, DefaultPort
成员变量 snake_case_ name_, count_

1.3 关键字 #

Carbon保留以下关键字:

text
api      as       auto     base     break    case
class    continue default  else     extends  extern
fn       for      function if       impl     import
in       interface let      match    me       namespace
package  partial  private  protected public   return
template that     then     typealias var      virtual
where    while    where
carbon
// 关键字不能用作标识符
fn fn() {}     // 错误:fn是关键字
var class: i32; // 错误:class是关键字

二、基本语法元素 #

2.1 语句 #

Carbon语句以分号结尾:

carbon
var x: i32 = 42;        // 变量声明语句
Print("Hello");         // 函数调用语句
return 0;               // 返回语句

2.2 代码块 #

使用花括号定义代码块:

carbon
fn Example() -> i32 {
  // 函数体是一个代码块
  var x: i32 = 42;
  {
    // 嵌套代码块
    var y: i32 = x + 8;
  }
  return x;
}

2.3 空白字符 #

carbon
// 空白字符不影响语义
var x: i32 = 42;
var  y  :  i32  =  42  ;  // 等价于上面

// 但建议保持一致的格式
var x: i32 = 42;
var y: i32 = 42;

三、注释 #

3.1 行注释 #

carbon
// 这是单行注释
var x: i32 = 42;  // 行尾注释

3.2 块注释 #

carbon
/*
 * 这是多行注释
 * 可以跨越多行
 */
var x: i32 = 42;

3.3 文档注释 #

carbon
/// 计算两个数的和
/// 
/// 参数:
///   a - 第一个数
///   b - 第二个数
/// 
/// 返回:
///   两数之和
fn Add(a: i32, b: i32) -> i32 {
  return a + b;
}

四、操作符 #

4.1 算术操作符 #

操作符 描述 示例
+ 加法 a + b
- 减法 a - b
* 乘法 a * b
/ 除法 a / b
% 取模 a % b
carbon
var a: i32 = 10 + 5;   // 15
var b: i32 = 10 - 5;   // 5
var c: i32 = 10 * 5;   // 50
var d: i32 = 10 / 5;   // 2
var e: i32 = 10 % 3;   // 1

4.2 比较操作符 #

操作符 描述 示例
== 等于 a == b
!= 不等于 a != b
< 小于 a < b
> 大于 a > b
<= 小于等于 a <= b
>= 大于等于 a >= b
carbon
var eq: bool = (5 == 5);    // true
var ne: bool = (5 != 3);    // true
var lt: bool = (3 < 5);     // true
var gt: bool = (5 > 3);     // true
var le: bool = (5 <= 5);    // true
var ge: bool = (5 >= 3);    // true

4.3 逻辑操作符 #

操作符 描述 示例
and 逻辑与 a and b
or 逻辑或 a or b
not 逻辑非 not a
carbon
var a: bool = true and false;   // false
var b: bool = true or false;    // true
var c: bool = not true;         // false

4.4 位操作符 #

操作符 描述 示例
& 按位与 a & b
| 按位或 a | b
^ 按位异或 a ^ b
~ 按位取反 ~a
<< 左移 a << n
>> 右移 a >> n
carbon
var a: i32 = 5 & 3;    // 1
var b: i32 = 5 | 3;    // 7
var c: i32 = 5 ^ 3;    // 6
var d: i32 = ~5;       // -6
var e: i32 = 5 << 2;   // 20
var f: i32 = 20 >> 2;  // 5

4.5 赋值操作符 #

carbon
var x: i32 = 10;
x += 5;   // x = x + 5 = 15
x -= 3;   // x = x - 3 = 12
x *= 2;   // x = x * 2 = 24
x /= 4;   // x = x / 4 = 6
x %= 4;   // x = x % 4 = 2

4.6 操作符优先级 #

从高到低:

优先级 操作符
1 () [] .
2 not ~ -(一元)
3 * / %
4 + -
5 << >>
6 < > <= >=
7 == !=
8 &
9 ^
10 |
11 and
12 or
13 = += -=
carbon
// 使用括号明确优先级
var result: i32 = (2 + 3) * 4;  // 20
var result2: i32 = 2 + 3 * 4;   // 14

五、表达式 #

5.1 字面量表达式 #

carbon
// 整数字面量
var int_dec: i32 = 42;       // 十进制
var int_hex: i32 = 0x2A;     // 十六进制
var int_bin: i32 = 0b101010; // 二进制

// 浮点字面量
var float_val: f64 = 3.14;
var float_exp: f64 = 1.5e10;

// 布尔字面量
var bool_true: bool = true;
var bool_false: bool = false;

// 字符串字面量
var str: String = "Hello, Carbon!";

5.2 算术表达式 #

carbon
var a: i32 = 10;
var b: i32 = 20;
var sum: i32 = a + b;
var product: i32 = a * b;
var complex: i32 = (a + b) * (a - b);

5.3 比较表达式 #

carbon
var x: i32 = 10;
var is_positive: bool = x > 0;
var is_even: bool = x % 2 == 0;
var in_range: bool = x >= 0 and x <= 100;

5.4 逻辑表达式 #

carbon
var a: bool = true;
var b: bool = false;
var result: bool = a and not b or (a == b);

六、变量声明 #

6.1 基本声明 #

carbon
// 使用var关键字声明变量
var name: String = "Carbon";
var age: i32 = 25;
var pi: f64 = 3.14159;

6.2 类型推断 #

carbon
// 自动推断类型
var x = 42;           // 推断为 i32
var y = 3.14;         // 推断为 f64
var z = "Hello";      // 推断为 String

6.3 常量 #

carbon
// 使用let声明不可变值
let MaxSize: i32 = 100;
let Pi: f64 = 3.14159265359;
let AppName: String = "MyApp";

七、类型系统 #

7.1 基本类型 #

类型 描述 示例
i8 8位有符号整数 -128127
i16 16位有符号整数 -3276832767
i32 32位有符号整数 -21474836482147483647
i64 64位有符号整数 更大范围
u8 8位无符号整数 0255
u16 16位无符号整数 065535
u32 32位无符号整数 04294967295
u64 64位无符号整数 更大范围
f32 32位浮点数 单精度
f64 64位浮点数 双精度
bool 布尔类型 truefalse
String 字符串类型 "Hello"

7.2 类型转换 #

carbon
var i: i32 = 42;
var d: f64 = f64(i);    // 整数转浮点
var s: i8 = i8(i);      // 截断转换

7.3 类型别名 #

carbon
typealias UserID = i64;
typealias Point = (f64, f64);

var id: UserID = 1001;
var p: Point = (1.0, 2.0);

八、代码组织 #

8.1 包结构 #

carbon
package MyPackage api;

// 公开API
fn PublicFunction() -> i32;

// 内部实现
private impl {
  fn HelperFunction() -> i32;
}

8.2 导入 #

carbon
package Main api;
import MyPackage;
import AnotherPackage;

fn Main() -> i32 {
  MyPackage.PublicFunction();
  return 0;
}

8.3 命名空间 #

carbon
namespace Math {
  fn Add(a: i32, b: i32) -> i32 {
    return a + b;
  }
  
  fn Subtract(a: i32, b: i32) -> i32 {
    return a - b;
  }
}

// 使用
var result: i32 = Math.Add(10, 5);

九、最佳实践 #

9.1 代码风格 #

carbon
// 好的风格
fn CalculateTotal(
  prices: [f64],
  discount: f64
) -> f64 {
  var total: f64 = 0.0;
  for (price in prices) {
    total += price;
  }
  return total * (1.0 - discount);
}

// 避免的风格
fn calc(p:[f64],d:f64)->f64{var t:f64=0.0;for(x in p){t+=x;}return t*(1.0-d);}

9.2 命名建议 #

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;

9.3 注释建议 #

carbon
/// 计算用户的折扣价格
/// 
/// 根据用户的会员等级计算最终价格
/// - 参数 price: 原始价格
/// - 参数 level: 会员等级 (1-5)
/// - 返回: 折扣后的价格
fn CalculateDiscount(price: f64, level: i32) -> f64 {
  var discount: f64 = 0.1 * f64(level);
  return price * (1.0 - discount);
}

十、总结 #

本章我们学习了:

  1. 标识符:命名规则和约定
  2. 关键字:保留字列表
  3. 操作符:算术、比较、逻辑、位操作
  4. 表达式:字面量、运算表达式
  5. 变量声明:var、let、类型推断
  6. 类型系统:基本类型、转换、别名
  7. 代码组织:包、导入、命名空间

接下来让我们深入学习Carbon的数据类型!

最后更新:2026-03-27