geekdoc-python-zh/docs/overiq/030.md

7.0 KiB
Raw Permalink Blame History

C 语言中的breakcontinue语句

原文:https://overiq.com/c-programming-101/the-break-and-continue-statement-in-c/

最后更新于 2020 年 7 月 27 日


break 语句

假设我们正在编写一个程序,在1000个数字中搜索一个特定的数字。在第十次迭代中,我们找到了想要的数字。此时,我们不想遍历剩余的 990 个数字,而是希望循环终止并继续执行循环后面的语句。这就是break语句发挥作用的地方。

当循环中遇到break语句时,程序控制立即脱离循环,用循环后的语句恢复执行。break语句通常与条件结合使用。

让我们举个例子:

#include<stdio.h>

int main()
{
    int i;

    for(i = 1; i < 10 ; i++)
    {
        if(i==5)
        {
            break; // breaks out of the for loop
        }
        printf("Value of i = %d\n", i);
    }

    // signal to operating system everything works fine
    return 0;
}

预期输出:

Value of i = 1
Value of i = 2
Value of i = 3
Value of i = 4

工作原理:

在第 5 次迭代中i的值变为5(i==5)的条件是检查,因为它是真实的。执行break语句,控制从 for 循环中出来,执行其后的语句。如果没有break语句,这个循环会被执行 9 次。

让我们创造一些更有用的东西。以下程序确定用户输入的数字是否为质数。

#include<stdio.h>

int main()
{
    int i, num, flag=1;

    printf("Enter a number: ");
    scanf("%d", &num);

    for(i = 2; i < num-1 ; i++)
    {
        /*
            when this condition becomes true,
            it means that entered number is
            divisible by a number between 2 and num-1.
            So it can't be prime.
        */
        if(num%i==0)
        {
            flag = 0; // number is not prime
        }
    }

    if(flag==1)
    {
        printf("%d is prime", num);
    }

    else
    {
        printf("%d is not prime prime", num);
    }

    // signal to operating system everything works fine
    return 0;
}

预期输出:

第一次运行:

Enter a number: 5
5 is prime

第二次运行:

Enter a number: 6
6 is not prime

工作原理:

如果一个数只能被 1 和它自己整除,它就是质数。这里有一种方法可以测试一个数是否是质数。试着把这个数从 2 除以小于这个数的 1如果发现它能被这个范围内的任何数整除那么它就不是质数否则就是质数。

2n-1循环所有数字后。如果变量flag的值保持设置为1。那么n这个数字就是质数,否则就不是质数。

假设在第一次运行中,用户输入了5

在 for 循环中i被初始化为2。检查条件(i < num-1)(2 < 4),因为它是真的,控制向前移动以执行循环的主体。在循环体中,测试 if 条件num%i == 0,即5%2 == 0因为它是假的。if 主体中的语句被省略。然后使用i++增加i的值。再次检查条件(i < num-1),即2 < 4,因为它仍然是真的,所以再次执行 for 的主体。重复该过程直到i < num-1。即使在第三次和第四次迭代后,flag的值保持不变,即1。当控制脱离 for 循环时,检查 if 条件,即flag==1因为它是真的if 语句体内部的语句被执行。

同样,假设在第二次运行中,用户输入了6

一切都和上面描述的完全一样。除了在第二次迭代中i达到 3 时,检查 if 条件(num%i==0),即6%3 == 0,因为它是真的。控件向前移动以在 if 块的主体内执行语句。在 if 块中,变量flag被初始化为1,这意味着数字不是质数。break语句打破了 for 循环。如果再次测试循环外的条件,即flag==1,因为它是假的,否则执行 else 块中的语句。

嵌套循环中的 break 语句

当在嵌套循环中使用break语句时,它只导致从最里面的循环退出。

#include<stdio.h>
int main()
{
    int i, j;

    for(i = 1; i < 5 ; i++)
    {
        printf("Outer for loop, i = %d\n", i);

        for(j = 1; j < 5 ; j++)
        {
            if(j==3)
            {
                 printf("Breaking out from the inner loop \n");  
                 break; // break out from inner loop only
            }
            printf("Inner for loop, j = %d\n", j);
        }
        printf("\n");
    }

    // signal to operating system program ran fine
    return 0;
}

预期输出:

Outer for loop, i = 1
Inner for loop, j = 1
Inner for loop, j = 2
Breaking out from the inner loop

Outer for loop, i = 2
Inner for loop, j = 1
Inner for loop, j = 2
Breaking out from the inner loop

Outer for loop, i = 3
Inner for loop, j = 1
Inner for loop, j = 2
Breaking out from the inner loop

Outer for loop, i = 4
Inner for loop, j = 1
Inner for loop, j = 2
Breaking out from the inner loop

在这种情况下,当j的值达到3时,条件j == 3被评估为真,break语句导致从内部 for 循环退出(外部 for 循环将继续执行),并且程序控制被转移到循环之后的语句。

连续语句

continue语句用于提前结束当前迭代,并继续进行下一次迭代。当在循环中遇到continue语句时,continue语句之后的所有语句都被省略,循环继续下一次迭代。continue语句与条件结合使用。

有时人们会混淆breakcontinue语句。请始终记住,当遇到break语句时,它会跳出循环,但是当遇到continue语句时,循环不会终止,而是将控制传递到循环的开头。

当在 while 和 do while 循环中遇到continue语句时,控制转移到测试条件,然后循环继续。而在 for 循环中,当遇到continue语句时,控制转移到更新表达式,然后测试条件。

以下程序使用continue语句打印010之间所有不能被4整除的数字。

#include<stdio.h>

int main()
{
    int i;

    for(i = 0; i < 10; i++)
    {
        if( i % 4 == 0 )
        {
            /*
                when i is divisible by 4
                continue to the next iteration
            */
            continue;
        }
        printf("%d\n", i);
    }

    // signal to operating system everything works fine
    return 0;
}

预期输出:

text 1 2 3 5 6 7 9 `

工作原理:

当 for 循环开始时,变量i被设置为0,然后测试条件(i < 10)(0 < 10),因为它是真的,程序控制向前移动以执行循环体。在循环体内部,检查 if 条件i % 4 == 00 % 4 == 0,因为它是假的,所以跳过 if 体中语句的执行。在第 17 行,我们使用printf()语句打印i的值。循环体中没有更多的语句要执行,因此程序控制转移到更新表达式(i++)。这就完成了第一次迭代。

在第 5 次迭代中,i的值达到4。然后测试 if 条件(i % 4 == 0),即(4 % 4 == 0),因为是真的,所以执行continue语句,控制转移到更新表达式。表达式i++将变量i的值增加1。然后,再次测试条件i < 10。这个过程一直持续到i < 10