1. 条件判断语句
1.1 if语句
if语句的用法与其他语言没什么区别。
void Func(int n) {
if (n > 0) {
print("正数");
} else {
if (n == 0) {
print("零");
} else {
print("负数");
}
}
}
值得一提的是,在检查模式下,if的条件表达式的值的类型必须是bool或bool的派生类,否则会引发异常(exception);在生产模式下,if的条件可以接受任何类型,但任何既非bool又非bool派生类的类型的变量一律被视为false。
if (1) { // 检查模式下引发异常;生产模式下等价于 if (false)
}
你没有看错,1被视为了false。
2. 开关语句
2.1 switch语句
switch语句格式如下:
switch (e) {
case 常量表达式1:
case 常量表达式1:
......
case 常量表达式n:
default:
}
其中e为一个表达式。设e的类型为T,则T必须是重载了operator==的。我将在后面的章节中介绍运算符重载,如果你接触过C++或C#等有运算符重载的语言,则很容易理解这个东西。没接触过也没关系,你可以暂时这么理解:设t1和t2都是T类型的变量,则表达式t1 == t2是合法的。
2.2 switch语句的性质
1)非空的case,在执行完之后必须以break、return、throw的方式结束switch,或者,用continue语句来执行另一个case(后文介绍continue语句);
2)空的case,可以直接贯穿下去。
void Func(int n) {
switch (n) {
case 1: // 空的case,可以贯穿下去
case 2:
case 3: // 非空的case
print("n为1、2或3");
break;
case 4: // 空的case,当然也可以用break结束switch
break;
default:
break;
}
}
3. 循环语句
3.1 for语句
Dart的for语句类似于C语言的,没有什么特别之处。
for (int i = 0; i < 10; i++) {
print(i);
}
3.2 forEach函数
Dart并未像很多语言那样提供“foreach语句”,但对于List和Map类型,Dart提供了forEach成员函数。
List<T>类型有成员函数forEach:
// Dart源码不是这么搞的,但可以这么理解:
class List<T> {
void forEach(void f(T t));
}
forEach接受一个以(T t)为参数列表,无返回值的函数。
void main() {
List<int> theList = [1, 3, 2, 90];
theList.forEach(Op);
}
void Op(int n) {
print(n);
}
Map<K, V>类型有成员函数forEach:
// Dart源码不是这么搞的,但可以这么理解:
class Map<K, V> {
void forEach(void f(K key, V value));
}
3.3 while语句
while可以看成是简化版的for。
while (x) {
// 代码
}
相当于:
for (; x;) {
// 代码
}
3.4 do-while语句
do-while和while的区别在于,一个先判断,一个先执行一次,然后再判断。这个和C语言是一样的。例子就不给了。
4. 跳转语句
break与continue
break与continue的用法与C语言等常见编程语言中是一样的:continue结束本次循环,break结束整个循环。
另外continue语句可以用在switch中,以达到执行完一个非空case之后继续执行另一个case的目的。
void Func(int n) {
switch (n) {
case 1:
print("case 1");
continue Label_; // 执行完case 1之后,继续执行case 2
Label_: case 2:
print("case 2");
break;
case 3:
print("case 3");
break;
default:
print("default");
break;
}
}
其中Label_的作用是为一个case添加标签,以便为continue语句指明跳转的位置。