C语言基础--控制语句详解

目录

1 C语言语句概述

2 条件语句

2.1 if...else...条件语句

2.1.1 if 开关语句

2.1.2 if...else...语句

2.1.3 if...else语句的嵌套

2.2 switch 多路分支语句

3 循环控制语句

3.1 for循环控制语句

3.2 while循环控制语句

3.2.1 while循环

3.2.2 do...while循环

3.2.3 while循环和do...while循环语句的区别

3.3 for和while循环的区别

4 其它特殊控制语句关键字

4.1 goto语句

4.2 break语句

4.2.1 switch语句中break

4.2.2 循环语句中的break

4.3 continue语句

4.4 return 语句

输入输出语句

1 数据输出语句

1.1 printf语句

1.2 字符输出:putchar

1.3 字符输出:puts

2 数据输入语句

2.1 scanf语句

2.2 getchar实现字符的输入


1 C语言语句概述

C语言是面向过程设计语言,程序的执行按照语句的先后逻辑顺序执行。

  1. 按照语句的先后顺序执行:

写在前面的语句先执行,后面的后执行;

  1. 按照特定的条件选择执行

在条件分支语句中,按照条件的true和false选择执行,在C语言主要提供了两种方式:

  1. if……else …… 条件分支

  2. switch 多路控制

  1. 对于需要连续循环执行,提供循环控制过程

    1. for循环控制

    2. while循环控制

2 条件语句

2.1 if...else...条件语句

2.1.1 if 开关语句

所谓的开关语句,指的是语句有两种状态,如果条件为true,则语句执行;否则条件为false,则语句不执行。

语法格式:

 if (条件表达式) {
     /* 语句块:是由一条或者多条语句构成,如果是一条语句,可以省略前后的花括号{}; 否则是由多条语句构成,花括号不能省略,此时或括号及其内部语句为整体 */
 }
 执行过程:
     执行条件表达式语句:结果为true和false
         结果为true,则语句块部分执行;结果为false,则语句块部分不执行;    
 

实例:

 #include <stdio.h>
 ​
 int main()
 {
         int a = 5;
         int b = 3;
         /* 由于a(=5) > b(=3)条件成立,执行语句块部分 */
         if (a > b) {
                 printf("a > b\n");
                 printf("max(a,b) = %d\n", a); 
         }
         /* 由于a < b 条件不成立,语句块部分不执行 */
         if (a < b) {
                 printf("a < b\n");
         }
 }
2.1.2 if...else...语句

语法格式:

if (条件表达式) {
     语句块1;
 } else {
     语句块2;
 }
 语句块1和语句块2:都可以只有1条语句或者由多条语句构成; 
 执行的过程:
     执行条件表达式语句,其结果为true和false;
         当结果为true,语句块1部分执行;当结果为false,语句块2部分执行;

实例:

#include <stdio.h>
 ​
 int main()
 {
         int score;
 ​
         scanf("%d", &score);
 ​
         if (score >= 0 && score <= 100) {
                 /* if条件成立,执行语句部分 */
                 printf("score = %d\n", score);
         } else {
                 /* if条件不成立,执行语句部分 */
                 printf("score is error\n");
         }          
 }

2.1.3 if...else语句的嵌套

实例:

 #include <stdio.h>
 ​
 int main()
 {
         int score;
 ​
         scanf("%d", &score);
 ​
         if (score >= 0 && score <= 100) {
                 if (score < 60) {
                         printf("E\n");
                 } else {
                         if (socre < 70) {
                                 printf("D\n");
                         } else {
                                 if (score < 80) {
                                         printf("C\n");
                                 } else {
                                         if (score < 90) {
                                                 printf("B\n");
                                         } else {
                                                 printf("A\n");
                                         }
                                 }
                         }
                 }
     } else {
         printf("score is error\n");
     }
 }

注意:

  1. else与前面的if匹配,满足就近原则。

  2. 在嵌套语句中,嵌套层次越多,执行效率越低;优化解决在实现过程中:在实现过程中减少嵌套的层数;将高频条件放在外层。

对于嵌套语句可以使用if...else if 语句实现

 if (条件表达式1) {    /* 条件表达式1成立:执行语句块1;条件表达式1不成立,执行条件表达式2 */
     语句块1    
 } else if (条件表达式2) {    /* 条件表达式2成立:执行语句块2;条件表达式2不成立,执行条件表达式3 */
     语句块2
 } else {
     语句块3
 }

实例:

 #include <stdio.h>
 ​
 int main()
 {
         int score;
 ​
         scanf("%d", &score);
 ​
         if (score < 0 || score > 100)
                 return -1;
 ​
         if (score >= 70 && score < 80) {
                 printf("C\n");
         } else if (score >= 80 && score < 90) {
                 printf("B\n");
         } else if (score >= 90 && score <= 100) {
                 printf("A\n");
         } else if (score >= 60 && score < 70) {
                 printf("D\n");
         } else {
                 printf("E\n");
         }
         return 0;
 }

2.2 switch 多路分支语句

语法格式:

switch(表达式) {        
     case 条件值1:
         语句块1;
         break;
     case 条件值2:
         语句块2;
         break;
     default:
         语句块n;
         break;
 }

注意:

  1. 表达式:可以是单个变量构成的表达式、也可以多个数据量和运算符构成表达式;表达式的处理结果不能是浮点型数据;

  2. 表达式的运算结果和case后面的条件值比对,进入到比对成功的case语句处开始执行;如果所都没有比对成功,进入到default语句处开始执行。

  3. 整个switch语句的结束为遇到break或者是整个switch语句执行完结束,可能存在多个case语句的结束是从同一个break结束。

  4. case结果连续区间执行的是统一部份语句块的时候,可以使用...表示区间范围:min ... max

int main()
{
        int score;

        scanf("%d", &score);
        if (score < 0 || score > 100)
                return -1; 


        switch(score/10) {
                case 10: 
                case 9:
                        printf("A\n");
                        break;
                case 8:
                        printf("B\n");
                        break;
                case 7:
                        printf("C\n");
                        break;
                case 6:
                        printf("D\n");
                        break;
//                case 0 ... 5:        /* 表示条件表达式结果为0-5区间范围的时候,进入case语句执行 */
                default:
                        printf("E\n");
        }
    
        return 0;    
}

3 循环控制语句

3.1 for循环控制语句

语法格式:

for (表达式1; 表达式2; 表达式3) {
    循环语句块;    /* 循环语句块可以是1条(可以省略花括号{})或者多条语句构成 */
}
执行过程:
    1. 执行表达式1,作为for循环语句的第一条执行语句,用于变量的初始化,可以省略,在整个循环过程中只会执行1次;
        在C99标准及其以后的标准中可以在此处定义变量:作用域循环体内部
    2. 执行表达式2:
        表达式2是条件表达式,结果为true则进入循环体中本次执行循环语句块;结果为false则结束整个循环。
        表达式2可以省略,默认结果为true
    3. 循环语句块的本次循环执行结束,执行表达式3;
    4. 表达式3:作为调优参数,可以省略。表达式3执行结束后再次跳转到表达式2执行。

实例:

#include <stdio.h>
#include <unistd.h>

int main()
{
        int i;

        for (i = 0; i < 10; i++) {
                printf("i = %d\n", i); 
                sleep(1);
        }

}

for循环语句可以嵌套使用:

  1. 可以是条件语句;

  2. for循环或者其它循环语句;

3.2 while循环控制语句

使用关键字while作为循环语句,实现包含while循环和do...while循环两种形式

3.2.1 while循环

语法格式

while(条件表达式) {
    循环体语句块;        /* 可以是一条(可以省略或括号{})或者多条语句, */
}
执行过程:
    先执行条件表达式:
        输出结构为true的时候:此时进入到循环体内执行本次循环过程;当执行结束在次执行条件表达式
        输出结构为false的时候:结束整个循环体;

实例

return 0;
#include <stdio.h>
#include <unistd.h>

int main()
{
        int i = 10; 

        while(i--) {
                printf("i = %d\n", i); 
                sleep(1);
        }

        return 0;
}
3.2.2 do...while循环

语法格式:

do {
    循环体语句块;
} while(条件表达式);
执行过程:
    进入到do循环体语句块中执行;
    执行条件表达式对循环条件进行判断,如果条件表达式结果为true在次进入循环体中执行;否则条件表达式结果为false则结束整个循环体
实例:

#include <stdio.h>
#include <unistd.h>

int main()
{
        int i = 10; 

        do {
                printf("i = %d\n", i);
        } while (i--);

        return 0;
}
3.2.3 while循环和do...while循环语句的区别

相同点:

都是使用while实现循环语句。

不同点:

a) while循环(while...do循环)先进行条件判断,在进入循环体执行;而do...while...循环 先执行循环体,在进行条件的判断。

b) while循环 可能不会进入循环体内部执行,而do...while...循环 至少会进入循环体内执行一次。

3.3 for和while循环的区别

相同点:

都是用于循环体语句块的循环多次执行;

不同点:

c) for循环,不会直接进入循环条件的判断,先初始化条件参数值;而while循环的条件初始值需要在循环体之前完成初始值设置。

d) for 循环专门调优表达式,可以设置条件参数值,而while循环需要在循环体内部(或者条件表达式)实现调优参数设置;

e) for循环一般用于循环次数明确的情况下,而while循环一般用于循环次数不确定的情况。

4 其它特殊控制语句关键字

4.1 goto语句

goto语句是C语言中跳转语句,可以用于函数内部语句的跳转,可以向前或者向后进行跳转,通过标签实现。在向前跳转的过程中,可能构成循环执行的方式。

对于goto语句的使用,一般底层驱动中出现的频度较高。

语法格式:

goto 标签;    /* 在语句的前或者后设置标签同名符号,在符号后是新的语句部分 */

实例:

#include <stdio.h>
#include <unistd.h>

int main()
{
        printf("%d\n", __LINE__);
        printf("%d\n", __LINE__);
        sleep(1);
        goto next;
        printf("%d\n", __LINE__);
        printf("%d\n", __LINE__);
loop:   
        printf("%d\n", __LINE__);
        printf("%d\n", __LINE__);
        goto func;
        printf("%d\n", __LINE__);
next:   
        printf("%d\n", __LINE__);
        printf("%d\n", __LINE__);
        printf("%d\n", __LINE__);
        printf("%d\n", __LINE__);
        sleep(1);
        goto loop;
        printf("%d\n", __LINE__);
        printf("%d\n", __LINE__);

4.2 break语句

break语句,主要在switch多路分支语句和循环控制语句中;

4.2.1 switch语句中break

表示的是多路分支语句执行结束。跳出switch向后执行;

4.2.2 循环语句中的break

表示的是整个循环体执行结束,跳出整个循环(此处循环可以是for循环或者是由while实现的循环)。循环体内break后面所有的语句都不在执行。

4.3 continue语句

对于continue 只能在循环语句内使用,表示结束本次循环,进入到下一次循环条件语句的执行。

4.4 return 语句

对于return语句,可以在函数内部的任意位置使用,表示整个函数执行结束;在函数结束的时候同时可以返回函数处理结果,函数的返回值。

  1. 如果函数的返回值数据类型为void,此时return语句直接为:return ; 只表示函数的结束;

  2. 如果函数的返回值数据类型不为void,此时return 语句后需要跟上返回值数据数据值或者表达式;返回处理结果。

输入输出语句

在计算机中需要实现数据的输入和输出语句。

1 数据输出语句

1.1 printf语句

printf实质是函数,可以用于任意数据类型数据的格式化输出。

#include <stdio.h>
int printf(const char *format, ...);
参数:format表示数据输出格式,将任意类型的数据转换为字符串数据输出
1. 基本格式的使用:

#include <stdio.h>

int main()
{
        printf("hello\n");
        printf("hello");

        printf("%d\n", 123);        /* %d以有符号整型数据输出,数据以十进制形式表示 */
        printf("%i\n", 123);        /* %i以有符号整型数据输出,数据以十进制形式表示 */
        printf("%u\n", 123);        /* %u以无符号整型数据输出,数据以十进制形式表示 */
        printf("%c\n", 123);        /* %c以字符形式输出  */
        printf("%x\n", 123);
        /* %x以十六进制整型数据输出:其中abcdef以小写形式输出 */
        printf("%X\n", 123);
        /* %X以十六进制整型数据输出:其中ABCDEF以大写形式输出 */
        printf("%o\n", 123);        /* %o以八进制整型数据输出 */
        printf("%e\n", 12.3);       /* %e和%E是讲浮点型数据以指数形式输出 */
        printf("%E\n", 12.3);

        printf("%f\n", 12.3);        /* %f和%F是以float数据类型输出 */         

        printf("%g\n", 12.3);        /* %f和%F是以float数据类型输出 */
        printf("%p\n", "abcdef");    /* %p表示输出数据的地址 */
}
2. 整型数据设置输出数据的宽度信息
printf("%5d\n", 123);        /* 在整型数据输出的时候,可以设置整型数据输出的位宽,如果位宽大于数据的位数,按照位宽输出(前面的位空出来),小于则按照数据数据位数输出 */
3. 浮点型数据,设置小数点后的位数
  printf("%7.2f",12.345678);    /* 7 数据位宽,.2表示保留小数点后2位小数 */

1.2 字符输出:putchar

int putchar(int c);
将字符c在标准输出中显示;没有换行标识。

1.3 字符输出:puts

int puts(const char *s);

2 数据输入语句

2.1 scanf语句

int scanf(const char *format, ...);
参数:format设置输入数据的数据类型,接收使用的变量空间的地址接收。
注意:

	1) scanf在数据输入的时候,要严格按照设置的格式实现数据的输入,否则出现错误。

2.2 getchar实现字符的输入

#include <stdio.h>

int main()
{
        char ch;
        char c;

        //scanf("%c", &ch);
        ch = getchar();    
        getchar();        /* 合理使用getchar吃掉回车换行符 */
        scanf("%c", &c);

        printf("ch = %c, c = %c\n", ch, c); 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值