目录
3.2.3 while循环和do...while循环语句的区别
1 C语言语句概述
C语言是面向过程设计语言,程序的执行按照语句的先后逻辑顺序执行。
-
按照语句的先后顺序执行:
写在前面的语句先执行,后面的后执行;
-
按照特定的条件选择执行
在条件分支语句中,按照条件的true和false选择执行,在C语言主要提供了两种方式:
-
if……else …… 条件分支
-
switch 多路控制
-
对于需要连续循环执行,提供循环控制过程
-
for循环控制
-
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");
}
}
注意:
-
else与前面的if匹配,满足就近原则。
-
在嵌套语句中,嵌套层次越多,执行效率越低;优化解决在实现过程中:在实现过程中减少嵌套的层数;将高频条件放在外层。
对于嵌套语句可以使用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;
}
注意:
-
表达式:可以是单个变量构成的表达式、也可以多个数据量和运算符构成表达式;表达式的处理结果不能是浮点型数据;
-
表达式的运算结果和case后面的条件值比对,进入到比对成功的case语句处开始执行;如果所都没有比对成功,进入到default语句处开始执行。
-
整个switch语句的结束为遇到break或者是整个switch语句执行完结束,可能存在多个case语句的结束是从同一个break结束。
-
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循环语句可以嵌套使用:
-
可以是条件语句;
-
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语句,可以在函数内部的任意位置使用,表示整个函数执行结束;在函数结束的时候同时可以返回函数处理结果,函数的返回值。
-
如果函数的返回值数据类型为void,此时return语句直接为:return ; 只表示函数的结束;
-
如果函数的返回值数据类型不为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);
}