• 分支结构和循环结构


    1.C语言关系运算符

    在程序中经常需要比较两个数据的大小,以决定程序下一步的工作。比如一个程序限制了只能成年人使用,儿童因为年龄不够,没有权限使用。这时候程序就需要获取用户输入的年龄并做出判断,如果超过18岁就正常运行,否则给出无权使用的提示。
     
    比较两个数据大小的运算符称为关系运算符(Relational Operators)。
     
    在C语言中有以下关系运算符:
    1) <(小于)
    2) <=(小于或等于)
    3) >(大于)
    4) >=(大于或等于)
    5) ==(等于)
    6) !=(不等于)
     
    关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。
     
    关系运算符的两边可以是变量、数据或表达式,例如:
    1) a+b>c-d
    2) x>3/2
    3) 'a'+1<c
    4) -i-5*j==k+1
     
    关系运算符也可以嵌套使用,例如:
    1) a>(b>c)
    2) a!=(c==d)
     
    关系运算符的运算结果为 0 或 1,如:
    5>0 成立,其值为 1;
    34-12<100 不成立,其值为 0;
    (a=3)>(b=5) 由于3>5不成立,故其值为 0。
     
    我们将运算结果 1 称为“真”,表示条件成立,将 0 称为“假”,表示条件不成立。
     
    我们不妨将关系运算符的结果输出看一下:
    1. #include <stdio.h>
    2. int main(){
    3. char c='k';
    4. int i=1, j=2, k=3;
    5. float x=3e+5, y=0.85;
    6. printf( "%d,%d ", 'a'+5<c, -i-2*j>=k+1 );
    7. printf( "%d,%d ", 1<j<5, x-5.25<=x+y );
    8. printf( "%d,%d ", i+j+k==-2*j, k==j==i+5 );
    9. return 0;
    10. }

    运行结果:
    1,0
    1,1
    0,0
     
    对于含多个关系运算符的表达式,如 k==j==i+5,根据运算符的左结合性,先计算k==j,该式不成立,其值为0,再计算0==i+5,也不成立,故表达式值为0。

    2.C语言逻辑运算符

    在高中数学中,我们学过逻辑运算,例如p为真命题,q就假命题,那么“p且q”为假,“p或q”为真,“非q”为真。
     
    在C语言中,也有类似的逻辑运算:
    运算符
    说明
    结合性
    举例
    &&
    与运算,双目,对应数学中的“且”
    左结合
    1&&0、(9>3)&&(b>a)
    ||
    或运算,双目
    左结合
    1||0、(9>3)||(b>a)
    !
    非运算。单目
    右结合
    !a、!(2<5)

    ①.逻辑运算的值

     
    逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示,其求值规则如下。
     
    1) 与运算(&&)
    参与运算的两个量都为真时,结果才为真,否则为假。例如:
        (5>0) && (4>2)
    由于5>0为真,4>2也为真,相与的结果也为真。
     
    2) 或运算(||)
    参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:
        (5>0) || (5>8)
    由于5>0为真,相或的结果也就为真。
     
    3) 非运算(!)
    参与运算量为真时,结果为假;参与运算量为假时,结果为真。例如:
        !(5>0)
    的结果为假。
     
    注意:在逻辑运算中,0 为假,非 0 值都是真,例如5为真,2*3为真。对于表达式(3+5)&&(9>3),由于3+5=8为真,9>3为真,所以结果也为真。

    ②.优先级

     
    逻辑运算符和其它运算符优先级从低到高依次为:赋值运算符(=) < &&和|| < 关系运算符 < 算术运算符 < 非(!)
     
    “&&”和“||”低于关系运算符,“!”高于算术运算符。
     
    按照运算符的优先顺序可以得出:
    1. a>b && c>d  等价于  (a>b)&&(c>d)
    2. !b==c||d<a  等价于  ((!b)==c)||(d<a)
    3. a+b>c&&x+y<b  等价于  ((a+b)>c)&&((x+y)<b)
     
    另外,逻辑表达式也可以嵌套使用,例如 a>b && b || 9>c,a || c>d &&  !p。
     
    逻辑运算符举例:
    1. #include <stdio.h>
    2. int main(){
    3. char c='k';
    4. int i=1,j=2,k=3;
    5. float x=3e+5,y=0.85;
    6. printf( "%d,%d ", !x*!y, !!!x );
    7. printf( "%d,%d ", x||i&&j-3, i<j&&x<y );
    8. printf( "%d,%d ", i==5&&c&&(j=8), x+y||i+j+k );
    9. return 0;
    10. }

    运行结果:
    0,0
    1,0
    0,1
     
    本例中!x和!y分别为0,!x*!y也为0,故其输出值为0。由于x为非0,故!!!x的逻辑值为0。对x|| i && j-3式,先计算j-3的值为非0,再求i && j-3的逻辑值为1,故x||i&&j-3的逻辑值为 1。对i<j&&x<y式,由于i<j的值为1,而x<y为0故表达式的值为1,0相与,最后为0,对i==5&&c&&(j=8)式,由于i==5为假,即值为0,该表达式由两个与运算组成,所以整个表达式的值为0。对于式x+ y||i+j+k由于x+y的值为非0,故整个或表达式的值为1。

    3.C语言if else语句

    前面我们看到的代码都是顺序执行的,也就是先执行第一条语句,然后是第二条、第三条……一直到最后一条语句。
     
    但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用,儿童因为年龄不够,没有权限使用。这时候程序就需要做出判断,看用户是否是成年人,并给出提示。

    ①.if-else语句

     
    在C语言中,使用if语句进行判断,请先看下面的代码:
    1. #include <stdio.h>
    2. int main()
    3. {
    4. int age;
    5. printf("请输入你的年龄:");
    6. scanf("%d", &age);
    7. if(age>=18){
    8. printf("恭喜,你已经成年,可以使用该软件! ");
    9. }else{
    10. printf("抱歉,你还未成年,不宜使用该软件! ");
    11. }
    12. return 0;
    13. }
    可能的运行结果:
    请输入你的年龄:23↙
    恭喜,你已经成年,可以使用该软件!
     
    if else 语句的结构为:
    if(表达式){
        语句块1
    }else{
        语句块2
    }
     
    意思是:如果表达式的值为真,则执行语句块1,否则执行语句块2 。其执行过程可表示为下图:

     
    所谓语句块(Statement Block),就是由{ }包围的一个或多个语句的集合。如果语句块中只有一个语句,也可以省略{ },例如:
    1. if(age>=18) printf("恭喜,你已经成年,可以使用该软件! ");
    2. else printf("抱歉,你还未成年,不宜使用该软件! ");
    由于if else 语句可以根据不同的情况执行不同的代码,所以也叫分支结构或选择结构,上面的代码中,就有两个分支。
     
    求两个数中的较大值:
    1. #include <stdio.h>
    2. int main()
    3. {
    4. int a, b, max;
    5. printf("输入两个整数:");
    6. scanf("%d %d", &a, &b);
    7. if(a>b) max=a;
    8. else max=b;
    9. printf("%d和%d的较大值是:%d ", a, b, max);
    10. return 0;
    11. }
    运行结果:
    输入两个整数:34 28↙
    34和28的较大值是:34
     
    本例中借助变量max,用max来保存较大的值,最后将max输出。

    ②.if语句

     
    我们可以只使用 if 语句,也就是说,if else不必同时出现。if 语句的基本形式为:
    if(表达式){
        语句块
    }
     
    意思是:如果表达式的值为真,则执行其后的语句块,否则直接跳过。其过程可表示为下图:
     
     
    只使用 if 语句来求两个数中的较大值:
    1. #include <stdio.h>
    2. int main()
    3. {
    4. int a, b, max;
    5. printf("输入两个整数:");
    6. scanf("%d %d", &a, &b);
    7. max=b; // 假设b最大
    8. if(a>b) max=a; // 如果a>b,那么更改max的值
    9. printf("%d和%d的较大值是:%d ", a, b, max);
    10. return 0;
    11. }

    运行结果:
    输入两个整数:34 28
    34和28的较大值是:34
     
    本例程序中,输入两个数a、b。把b先赋予变量max,再用 if 语句判别max和b的大小,如max小于b,则把b赋予max。因此max中总是大数,最后输出max的值。

    ③.多个if else语句

     
    if else语句也可以多个同时使用,构成多个分支,形式如下:
    if(表达式1){
        语句块1
    } else  if(表达式2){
        语句块2
    }else  if(表达式3){
        语句块3
    }else  if(表达式m){
        语句块m
    }else{
         语句块n
    }
     
    意思是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句块n。然后继续执行后续程序。多个 if else 语句的执行过程如下图所示:
     
     
    例如,判断输入的字符的类别:
    1. #include <stdio.h>
    2. int main(){
    3. char c;
    4. printf("Input a character:");
    5. c=getchar();
    6. if(c<32)
    7. printf("This is a control character ");
    8. else if(c>='0'&&c<='9')
    9. printf("This is a digit ");
    10. else if(c>='A'&&c<='Z')
    11. printf("This is a capital letter ");
    12. else if(c>='a'&&c<='z')
    13. printf("This is a small letter ");
    14. else
    15. printf("This is an other character ");
    16. return 0;
    17. }
    运行结果:
    Input a character:e
    This is a small letter
     
    本例要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII值小于32的为控制字符。在“0”和“9”之间的为数字,在“A”和“Z”之间为大写字母, 在“a”和“z”之间为小写字母,其余则为其它字符。这是一个多分支选择的问题,用多个 if else 语句编程,判断输入字符ASCII码所在的范围,分别给出不同的输出。例如输入为“e”,输出显示它为小写字符。
     
    在使用if语句时还应注意以下问题:
    1) 在三种形式的if语句中,在 if 关键字之后均为表达式。 该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。例如:
        if(a=5) 语句;
        if(b) 语句;
    都是允许的。只要表达式的值为非0,即为“真”。如在:
        if(a=5)…;
    中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。
     
    又如,有程序段:
    1. if(a=b)
    2. printf("%d",a);
    3. else
    4. printf("a=0");

    本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。
     
    2) 在if语句中,条件判断表达式必须用括号括起来。
     
    3) 语句块由{ }包围,但要注意的是在}之后不要再加分号;。例如:
    1. if(a>b){
    2. a++;
    3. b++;
    4. }else{
    5. a=0;
    6. b=10;
    7. }

    ④.if语句的嵌套

     
    if 语句也可以嵌套使用,例如:
    1. #include <stdio.h>
    2. int main(){
    3. int a,b;
    4. printf("Input two numbers:");
    5. scanf("%d %d",&a,&b);
    6. if(a!=b){
    7. if(a>b) printf("a>b ");
    8. else printf("a<b ");
    9. }else{
    10. printf("a=b ");
    11. }
    12. return 0;
    13. }

    运行结果:
    Input two numbers:12 68
    a<b
     
    if 语句嵌套时,要注意 if 和 else 的配对问题。C语言规定,else 总是与它前面最近的 if 配对,例如:
    复制纯文本新窗口
    1. if(a!=b) // ①
    2. if(a>b) printf("a>b "); // ②
    3. else printf("a<b "); // ③
    ③和②配对,而不是和①配对。

    4.C语言switch语句

    用 if else 语句在处理多分支的时候,分支太多就会显得不方便,且容易出现 if 和 else配对出现错误的情况。例如,输入一个整数,输出该整数对应的星期几的英文表示:
    1. #include <stdio.h>
    2. int main(){
    3. int a;
    4. printf("Input integer number:");
    5. scanf("%d",&a);
    6. if(a==1){
    7. printf("Monday ");
    8. }else if(a==2){
    9. printf("Tuesday ");
    10. }else if(a==3){
    11. printf("Wednesday ");
    12. }else if(a==4){
    13. printf("Thursday ");
    14. }else if(a==5){
    15. printf("Friday ");
    16. }else if(a==6){
    17. printf("Saturday ");
    18. }else if(a==7){
    19. printf("Sunday ");
    20. }else{
    21. printf("error ");
    22. }
    23. return 0;
    24. }

    运行结果:
    Input integer number:3↙
    Wednesday
     
    C语言还提供了另外一种多分支选择的语句——switch 语句,它的基本语法格式如下:
    switch(表达式){
        case 常量表达式1: 语句 1;
        case 常量表达式2: 语句 2;
        ......
        case 常量表达式n: 语句 n;
        default: 语句 n+1;
    }
     
    它的执行过程是:首先计算“表达式”的值,然后从第一个 case 开始,与“常量表达式x”进行比较,如果与当前常量表达式的值不相等,那么就不执行冒号后边的语句 x,一旦发现和某个常量表达式的值相等了,那么它会执行之后所有的语句,如果直到最后一个“常量表达式 n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。
     
    需要注意的是,当找到一个相等的 case 分支后,会执行该分支以及之后所有分支的语句。例如:
    1. #include <stdio.h>
    2. int main(){
    3. int a;
    4. printf("Input integer number:");
    5. scanf("%d",&a);
    6. switch(a){
    7. case 1: printf("Monday ");
    8. case 2: printf("Tuesday ");
    9. case 3: printf("Wednesday ");
    10. case 4: printf("Thursday ");
    11. case 5: printf("Friday ");
    12. case 6: printf("Saturday ");
    13. case 7: printf("Sunday ");
    14. default:printf("error ");
    15. }
    16. return 0;
    17. }

    运行结果:
    Input integer number:4↙
    Thursday
    Friday
    Saturday
    Sunday
    error
     
    输入4,发现和第四个分支匹配,于是就执行第四个分支以及后面的所有分支。这显然不是我们想要的结果,我们希望只执行第四个分支,跳过后面的所有分支。
     
    为了避免这种情况,C语言还提供了一个关键字 break,专门用于跳出switch语句。
     
    switch 的分支语句一共有 n+1 种,而我们通常希望的都是选择其中的一个分支来执行,执行完后就结束整个 switch 语句,而继续执行 switch后面的语句,此时就可以通过在每个分支后加上 break 语句来实现了。如下:
    switch (表达式){
        case 常量表达式1: 语句1; break;
        case 常量表达式2: 语句2; break;
        ......
        case 常量表达式n: 语句n; break;
        default: 语句n+1; break;
    }
    加了这个 break 语句后,一旦“常量表达式 x”与“表达式”的值相等了,那么就执行“语句 x”,执行完毕后,由于有了 break 则直接跳出 switch 语句,继续执行 switch 语句后面的程序了,这样就可以避免执行不必要的语句。
     
    使用switch语句修改上面的代码:
    1. #include <stdio.h>
    2. int main(){
    3. int a;
    4. printf("Input integer number:");
    5. scanf("%d",&a);
    6. switch(a){
    7. case 1: printf("Monday "); break;
    8. case 2: printf("Tuesday "); break;
    9. case 3: printf("Wednesday "); break;
    10. case 4: printf("Thursday "); break;
    11. case 5: printf("Friday "); break;
    12. case 6: printf("Saturday "); break;
    13. case 7: printf("Sunday "); break;
    14. default:printf("error "); break;
    15. }
    16. return 0;
    17. }

    运行结果:
    Input integer number:4↙
    Thursday
    值得一提的是,由于default是最后一个分支,匹配后不会再执行其他分支,所以也可以不用break;语句。

    5.C语言条件运算符

    如果希望获得两个数中最大的一个,可以使用 if 语句,例如:
    1. if(a>b){
    2. max = a;
    3. }else{
    4. max = b;
    5. }

    不过,C语言提供了一种更加简单的方法,叫做条件运算符,语法格式为:
        表达式1 ? 表达式2 : 表达式3
     
    条件运算符是C语言中唯一的一个三目运算符,其求值规则为:如果表达式1的值为真,则以表达式2 的值作为整个条件表达式的值,否则以表达式3的值作为整个条件表达式的值。条件表达式通常用于赋值语句之中。
     
    上面的 if else 语句等价于:
    1. max = (a>b) ? a : b;
    该语句的语义是:如a>b为真,则把a赋予max,否则把b 赋予max。
    你可以认为条件运算符是一种简写的 if else,你完全可以用 if else 代替条件运算符。
    使用条件表达式时,还应注意以下几点:
    1) 条件运算符的优先级低于关系运算符和算术运算符,但高于赋值符。因此
    1. max=(a>b) ? a : b;
    可以去掉括号而写为
    1. max=a>b ? a : b;
     
    2) 条件运算符?和:是一对运算符,不能分开单独使用。
     
    3) 条件运算符的结合方向是自右至左。例如:
    1. a>b ? a : c>d ? c : d;
    应理解为:
    1. a>b ? a : ( c>d ? c : d );
    这也就是条件表达式嵌套的情形,即其中的表达式又是一个条件表达式。
     
    用条件表达式重新编程,输出两个数中的最大值:
    1. #include <stdio.h>
    2. int main(){
    3. int a, b, max;
    4. printf("Input two numbers:");
    5. scanf("%d %d", &a, &b);
    6. printf("max=%d ", a>b?a:b);
    7. return 0;
    8. }

    运行结果:
    Input two numbers:23 45
    max=45

    6.C语言while语句

    在C语言中,共有三大常用的程序结构:
    1. 顺序结构:代码从前往后执行,没有任何“拐弯抹角”;
    2. 选择结构:也叫分支结构,重点要掌握 if else、switch 以及条件运算符;
    3. 循环结构:重复执行同一段代码。
     
    前面讲解了顺序结构和选择结构,本节开始讲解循环结构。所谓循环(Loop),就是重复地执行同一段代码,例如要计算 1+2+3+……+99+100 的值,就要重复进行99次加法运算。

    ①.while循环

     
    while循环的一般形式为:
        while(表达式){
            语句块
        }
    其中表达式称为循环条件,语句块称为循环体
     
    while语句的意思是:先计算表达式的值,当值为真(非0)时, 执行循环体语句;执行完循环体语句,再次计算表达式的值,如果为真,继续执行循环体……这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行后面的语句。其执行过程如下图所示:
     
     
    用while语句计算1加到100的值:
    1. #include <stdio.h>
    2. int main(void){
    3. int i=1, sum=0;
    4. while(i<=100){
    5. sum+=i;
    6. i++;
    7. }
    8. printf("%d ",sum);
    9. return 0;
    10. }

    运行结果:
    5050
     
    代码分析:
    1) 程序运行到while语句时,因为 i=1,i<=100 的值为真,所以执行循环体;执行结束后 i 的值变为 2,sum 的值变为 1。
     
    2) 接下来会继续判断 i<=100是否成立,因为此时 i=2,i<=100 成立,所以继续执行循环体;执行结束后 i 的值变为 3,sum 的值变为3。
     
    3) 重复执行步骤 2)。
     
    4) 当循环进行到第100次,i 的值变为 101,sum 的值变为5050;因为此时 i<=100 不再成立,所以就退出循环,不再执行循环体,转而执行while循环后面的代码。
     
    再看一个例子,统计从键盘输入的一行字符的个数:
    1. #include <stdio.h>
    2. int main(){
    3. int n=0;
    4. printf("Input a string:");
    5. while(getchar()!=' ') n++;
    6. printf("Number of characters: %d ", n);
    7. return 0;
    8. }

    运行结果:
    Input a string:c.biancheng.net↙
    Number of characters: 15
     
    本例程序中的循环条件为getchar()!=' ',其意义是,只要从键盘输入的字符不是回车就继续循环。循环体n++;完成对输入字符个数计数。

    ①.do-while循环

     
    除了while循环,在C语言中还有一种 do-while 循环。
     
    do-while循环的一般形式为:
    do{
        语句块
    }while(表达式);
     
    do-while循环与while循环的不同在于:它会先执行循环体,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次循环体。其执行过程可用下图表示:
     
     
    用do-while计算1加到100的值:
    1. #include <stdio.h>
    2. int main(){
    3. int i=1, sum=0;
    4. do{
    5. sum+=i;
    6. i++;
    7. }while(i<=100);
    8. printf("%d ", sum);
    9. return 0;
    10. }

    运行结果:
    5050
    注意 while(i<=100); 最后的分号;,这个必须要有。
    while循环和do-while各有特点,大家可以适当选择,实际编程中使用while循环较多。

    7.C语言for循环

    除了while循环,C语言中还有for循环,它的使用更加灵活,完全可以取代while循环。
     
    for循环的一般形式为:
    for(表达式1; 表达式2; 表达式3){
        语句块
    }
     
    它的执行过程如下:
    1) 先求解表达式1。
     
    2) 求解表达式2,若其值为真(非0),则执行循环体,否则结束循环。
     
    3) 执行完循环体,再求解表达式3。
     
    4) 重复执行步骤 2) 和 3),直到循环结束。
     
    注意:表达式1仅在第一次循环时求解,以后都不会再执行,可以认为这是一个初始化语句
     
    for循环的执行过程可用下图表示:
     
     
    用for循环来计算1加到100的值:
    1. #include <stdio.h>
    2. int main(){
    3. int i, sum=0;
    4. for(i=1; i<=100; i++){
    5. sum+=i;
    6. }
    7. printf("%d ",sum);
    8. return 0;
    9. }

    运行结果:
    5050
     
    代码分析:
    1) 执行到 for 语句时,先给 i 赋初值1,判断 i<=100 是否成立;因为此时 i=1,i<=100 成立,所以执行循环体。循环体执行结束后(sum的值为1),再计算 i++。
     
    2) 第二次循环时,i 的值为2,i<=100 成立,继续执行循环体。循环体执行结束后(sum的值为3),再计算 i++。
     
    3) 重复执行步骤 2),直到第101次循环,因为此时 i 的值为101,i<=100 不成立,所以结束循环。
     
    整个for语句相当于:
    1. i=1;
    2. while(i<=100){
    3. sum+=i;
    4. i++;
    5. }
    由此我们可以总结出for循环的一般形式:
    for(循环变量赋初值; 循环条件; 循环变量增量){
        语句块
    }
    循环变量赋初值总是一个赋值语句,它用来给循环控制变量赋初值;循环条件是一个关系表达式,它决定什么时候退出循环;循环变量增量,定义循环控制变量每循环一次后按什么方式变化。这三个部分之间用分号;分开。

    ①.使用for语句应该注意

     
    1) for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项,即可以缺省,但分号(;)不能缺省。
     
    2) 省略了“表达式1(循环变量赋初值)”,表示不对循环控制变量赋初值。
     
    3) 省略了“表达式2(循环条件)”,则不做其它处理时便成为死循环。例如:
    1. for(i=1; ; i++) sum=sum+i;

    相当于:
    1. i=1;
    2. while(1){
    3. sum=sum+i;
    4. i++;
    5. }

    所谓死循环,就是循环条件永远为真,循环会一直进行下去,永不结束。死循环对程序的危害很大,一定要避免。
    4) 省略了“表达式3(循环变量增量)”,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。例如:
    1. for( i=1; i<=100; ){
    2. sum=sum+i;
    3. i++;
    4. }

     
    5) 省略了“表达式1(循环变量赋初值)”和“表达式3(循环变量增量)”。例如:
    1. for( ; i<=100 ; ){
    2. sum=sum+i;
    3. i++;
    4. }

    相当于:
    1. while(i<=100){
    2. sum=sum+i;
    3. i++;
    4. }

     
    6) 3个表达式都可以省略。例如:
        for( ; ; )  语句
    相当于:
        while(1)  语句
     
    7) 表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。例如:
    1. for( sum=0; i<=100; i++ ) sum=sum+i;

     
    8) 表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。
    1. for( sum=0,i=1; i<=100; i++ ) sum=sum+i;
    或:
    1. for( i=0,j=100; i<=100; i++,j-- ) k=i+j;

     
    9) 表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。例如:
    1. for( i=0; (c=getchar())!=' '; i+=c );

    又如:
    1. for( ; (c=getchar())!=' ' ; )
    2. printf("%c",c);

     
    for循环也可以嵌套使用,例如:
    1. #include <stdio.h>
    2. int main(){
    3. int i, j, k;
    4. printf("i j k ");
    5. for (i=0; i<3; i++) // 循环①
    6. for(j=0; j<3; j++) // 循环②
    7. for(k=0; k<3; k++) // 循环③
    8. printf("%d %d %d ", i, j, k);
    9. return 0;
    10. }

    8.C语言跳出循环

    使用while或for循环时,如果想提前结束循环,可以使用break或continue语句。

    ①.break语句

     
    在讲解 switch 语句时,我们使用到了break,用来跳出switch语句。
     
    当break语句用于 while、for 循环语句中时,会终止循环而执行循环语句后面的代码。break语句通常和 if 语句一起使用,即满足条件时便跳出循环。
     
    使用while循环计算1加到100的值:
    1. #include <stdio.h>
    2. int main(){
    3. int i=1, sum=0;
    4. while(1){ //循环条件为死循环
    5. sum+=i;
    6. i++;
    7. if(i>100) break;
    8. }
    9. printf("%d ", sum);
    10. return 0;
    11. }

    运行结果:
    5050
     
    while循环条件为 1,是一个死循环。当执行到第100次循环的时候,计算完i++;后 i 的值为 101,此时 if 语句的条件 i> 100 成立,执行break;语句,结束循环。
     
    在多层循环中,一个break语句只向外跳一层。例如,输出一个4*4的整数矩阵:
    1. #include <stdio.h>
    2. int main(){
    3. int i=1, j;
    4. while(1){ // 外层循环
    5. j=1;
    6. while(1){ // 内层循环
    7. printf("%-4d", i*j);
    8. j++;
    9. if(j>4) break; //跳出内层循环
    10. }
    11. printf(" ");
    12. i++;
    13. if(i>4) break; // 跳出外层循环
    14. }
    15. return 0;
    16. }

    运行结果:
    1   2   3   4
    2   4   6   8
    3   6   9   12
    4   8   12  16
    当 j>4 成立时,执行break;,跳出内层循环;外层循环依然执行,直到 i>4 成立,跳出外层循环。内层循环共执行了4次,外层循环共执行了1次。

    ②.continue语句

     
    continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。
     
    来看一个例子:
    #include <stdio.h>
    int main(){
        char c;
        while(c!=13){  //回车符结束循环
            c=getch();
            if(c==0X34)  // 按下的是数字键4
                continue;  // 不执行printf语句便进行下次循环
            printf("%c", c);
        }
        printf(" ");
        return 0;
    }
    输入 123456789,只能显示12356789,4 没有显示。
     
    break与continue的对比:break 用来结束所有循环,循环语句不再有执行的机会;continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。

    9.C语言循环总结

    除了 while 和 for 语句,在C语言中还有一个语句 goto,它也能构成循环。不过由于 goto 语句很容易造成代码混乱,维护和阅读困难,饱受诟病,不被推荐,而且 goto 循环完全可以被其他循环取代,所以后来的很多编程语言都取消了 goto 语句,我们也不再讲解。
    国内很多大学仍然讲解 goto 语句,但也仅仅是完成教材所设定的课程,goto 语句在实际开发中很难见到,笔者也没有使用过。

    ①.总结

     
    while和for 循环都可以用来处理同一个问题,一般可以互相代替。
     
    对于while和do-while循环,循环体中应包括使循环趋于结束的语句。
     
    用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成,而for语句可以在内部实现循环变量的初始化。
     
    for循环是最常用的循环,它的功能强大,可以代替其他循环。

    ②.几个例子

     
    用下面的公式求π:
     
     
    分析:首先,系数为正数的项的分母是4n-3(n为正数项的项数),为负数的项的分母为4n-1(n为负数项的项数),即分母的变化规律是1、3、5、7...的奇数数列,则第n项的分母为2n-1,第10000项的分母为2*10000-1。
    1. #include <stdio.h>
    2. #include <math.h>
    3. int main()
    4. {
    5. double p=0,j=1;
    6. int i;
    7. for( i=1;i<10000;i++ ) //此处i为项数
    8. {
    9. j=pow(-1.0,i+1)/(2*i-1); //pow(x,y)用来求x的y次幂
    10. p+=j;
    11. printf("%lf ",4*p); //输出每一项的值
    12. }
    13. printf("%lf ",4*p); //输出最终pi值
    14. return 0;
    15. }

    由于输出结果较多,请大家自己运行代码。





  • 相关阅读:
    Expression基础体验
    浅谈Pool对象
    TreeBuilder科学的树创建器
    2种负载均衡算法
    亲自打造Deferred对象
    Animation
    micro-template改造
    Node.js的缺陷
    让JSON.js完全适应.NET
    关系型数据库操作一些不好用的地方
  • 原文地址:https://www.cnblogs.com/caizheng/p/6155209.html
Copyright © 2020-2023  润新知