break、continue、goto


break可以离开目前switchforwhiledo while区块,并前进至区块后下一个语句,在switch主要用来结束语句进行至下一个case的比对,在forwhiledo while,主要用于中断目前的循环执行,如果break不是出现在forwhile循环或switch之中,会发生编译错误,底下是个使用 break 的for例子:

for(int i = 1; i < 10; i++) {
    if(i == 5) {
        break;
    }

    cout << "i = " << i << endl;
}

continue的作用与break类似,使用于循环,不同的是break会结束区块的执行,而continue只会当次循环,并跳回循环区块开头继续下一循环,而不是离开循环,例如上面的范例会显示 i = 1 到 4,因为当i等于 5 时就会执行break而离开循环,再看下面这个程序:

for(int i = 1; i < 10; i++) {
    if(i == 5) {
        continue;
    }

    cout << "i = " << i << endl;
}

这段程序会显示 1 到 4,与 6 到 9,当i等于 5 时,会执行continue直接结束此次循环,这次循环cout该行并没有被执行,然后从区块开头头执行下一次循环,所以 5 并没有被显示。

goto是个很方便,但不被建议使用的语法,滥用的话会破坏程序的架构、使得程序难以阅读,事实上,在完全不使用goto的情况下,也能编写程序。

goto可以在程序中任意跳跃,跳跃前必须先设定好目的地,跳跃时必须指定目的地,例如:

START:
....
....
goto START;

其中START就是goto的一个目标标签(Label),后面使用冒号,标签可以出现在程序的任一个地方。

一个简单的例子是这样的:

#include <iostream> 
using namespace std; 

int main() { 

BEGIN: 
    int input = 0; 
    cout << "输入一数:"; 
    cin >> input; 

    if(input == 0) {
        goto ERROR; 
    }

    cout << "100 / " << input 
         << " = " << 100.0 / input 
         << endl; 

    return 0; 

ERROR: 
    cout << "除数不可为 0" << endl; 
    goto BEGIN;
}

执行结果:

输入一数:0
除数不可为 0
输入一数:10
100 / 10 = 10

如果输入 0,程序会跳至ERROR标签然后显示错误消息,并重新跳至BEGIN标签,然后再执行一次提示与输入。

可想而知地,若随意使用goto,程序的逻辑马上会变得混乱不堪,可以的话应避免使用,这个程序也可以如下编写:

#include <iostream> 
using namespace std; 

int main() { 
    int input; 

    do { 
        cout << "输入一数:"; 
        cin >> input; 

        if(input) { 
            cout << "100 / " << input 
                 << " = " 
                 << 100.0 / input 
                 << endl;  
            break;
        } 

        cout << "除数不可为 0" << endl;

    } while(true);

    return 0; 
}




展开阅读全文