1 C语言中控制语句概述
在c语言中,控制逻辑主要包含三种:
1.顺序执行:
所谓的顺序执行,指的程序按照特定先后顺序依次执行;也是C语言的特征(面向过程语言);
2.选择分支:
在执行过程中,某些特殊的语句,需要满足特定条件才能执行。C语言中的选择分支可以使用if……else语句实现,也可以使用switch控制语句实现。
3.循环控制:
在执行过程中,某些功能语句块,需要多次重复执行。C语言中可以使用for循环、while循环以及使用goto实现循环控制。
在程序设计的时候,所有的逻辑都是通过前面三种逻辑语句来综合实现。
2 选择分支语句
在程序设计的时候,会因为不同条件会有不同的处理方式,通过调节控制语句实现逻辑。
2.1 if……else选择分支
1.if控制语句
条件满足会执行,条件不满足不执行。也称为开关语句。
语法形式:
if (条件表达式) {
执行语句部分; /* 当条件表达式结果为true,运行执行语句部分;当条件为false,执行语句部分不会执行 */
}
实例代码:
#include <stdio.h>
int main()
{
int score;
scanf("%d", &score);
if (score >= 0 && score <= 100) {
printf("score = %d\n", score);
/* 只有当输入成绩 [0,100] 才执行 */
}
return 0;
}
2.if …… else 语句
if (条件表达式) { /* 条件表达式结果为true运行执行语句1的部分;结果为false运行执行语句2的部分 */
执行语句1部分
}
else
{
执行语句2部分
}
if……else实例
#include <stdio.h>
int main()
{
int score;
scanf("%d", &score);
if (score >= 0 && score <= 100) {
printf("score = %d\n", score); /* 条件表达式为true的执行语句部分 */
} else {
printf("score error!\n"); /* 条件表达式为false的执行部分 */
}
return 0;
}
3.if……else if…… 嵌套实现
#include <stdio.h>
int main()
{
int score;
scanf("%d", &score);
if (score < 0 || score > 100) {
printf("score error!\n");
return -1;
}
if (score >= 90 && score <= 100) {
printf("A\n");
} else if (score >= 80 && score < 90) {
printf("B\n");
} else if (score >= 70 && score < 80) {
printf("C\n");
} else if (score >= 60 && score < 70) {
printf("D\n");
} else {
printf("E\n");
}
return 0;
}
2.2 switch条件控制语句
switch(条件表达式) { /* 条件表达式输出结果可以有多个结果,条件表达式的数据类型不能是浮点型数据 */
case 条件表达式结果值1:
执行语句部分1;
break; /*遇到break,语句一定结束 */
case 条件表达式结果值2: /* case不一定是本次执行的入口 */
执行语句部分2;
break;
default:
执行语句部分;
break;
}
执行注意:
- 在执行过程中会根据条件表达式的值进入到对应的case语句处开始向后顺序执行;
- 如果找不到对应的case语句,进入到default语句处开始执行。
- 不管是从那条case语句开始执行,只要遇到break,switch语句执行结束;
- 进入到case语句后,只要没有遇到break,不管遇到多少次case语句,程序都会继续向后执行到break或者switch本身结束。
#include <stdio.h>
int main()
{
int score;
scanf("%d", &score);
if(score < 0 || score > 100) {
printf("score error\n");
return -1;
}
score /= 10; /* 0,1,2,3,4,5,6,7,8,9,10 */
switch(score) {
#if 0
case 10:
case 9:
#else
case 9 ... 10: /* 表示的是范围:9到10 的区间;需要注意符号(...) 左右两边有空格 */
#endif
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break;
default: /* case 0 ... 5: */
printf("E\n");
break;
}
return 0;
}
3. 循环控制语句
在某些情况下,执行语句需要连续多次执行,使用循环控制语句实现,可以减少代码量。
3.1 for循环控制语句
1.表达式1,用于初始化条件参数,可以省略表示用已有的初始参数值。
2.表达式2,实质式条件表达式,结果为true进入到循环体中执行,结果为false结束整个循环;可以省略默认为条件成立表示死循环。
3.表达式3,用于条件参数调节,可以省略表示参数不做调节(可以在循环体中调节)。
#include <stdio.h>
#include <unistd.h>
int main()
{
int i;
for (i = 0; i < 10; i++) {
printf("i = %d\n", i);
sleep(1);
}
return 0;
}
3.2 while循环控制
3.2.1 while……do语句
其实质就是通常所说的while语句;
while(条件表达式) { /* 条件表达式结果为true进入到循环体中执行,结果为false结束整个循环 */
循环体;
}
while……do语句实例:
#include <stdio.h>
#include <unistd.h>
int main()
{
int i = 0; /* 循环条件参数的初始值需要循环执行之前设置 */
while(i < 10) { /* 循环条件判断,为true进入循环体执行,为false结束循环 */
printf("i = %d\n", i++); /* 循环参数调节,一般在循环体中实现。 */
sleep(1);
}
return 0;
}
3.2.2 do……while语句
do {
循环执行语句;
} while(调节表达式); /* 循环体每执行一次进行条件判断,为true进入到下一次循环体的执行,为false结束整个循环 */
do……while语句实例
#include <stdio.h>
#include <unistd.h>
int main()
{
int i = 0;
do {
printf("i = %d\n", i++);
sleep(1);
} while(i < 10);
return 0;
}
3.2.3 while……do和do……while区别
相同点:
都是使用while实现循环控制;当判断条件为false的时候结束循环。
不同点:
1. 前者先判断,再执行;后者先执行再做判断;
2. 前者可能一次都不执行,后者至少会执行一次。
3.3 goto语句
所谓的goto语句,其实质是跳转语句,跳转到goto后面所跟的标签位置处。在goto跳转的时候可以向前跳转和向后跳转
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("%d\n", __LINE__);
sleep(1);
goto next; /* 向后跳转next标签位置处开始执行 */
printf("%d\n", __LINE__);
printf("%d\n", __LINE__);
loop:
printf("%d\n", __LINE__);
printf("%d\n", __LINE__);
next:
printf("%d\n", __LINE__);
printf("%d\n", __LINE__);
goto loop; /* 向前跳转loop标签位置处开始执行,又能会构成循环过程 */
printf("%d\n", __LINE__);
printf("%d\n", __LINE__);
}
4 特殊语句
4.1 break语句
所谓的break语句,也表示结束语句;
4.1.1 switch语句中break语句
此时的break表示条件模块执行语句的结束。
4.1.2 循环控制语句中的break语句
此时的break表示整个循环结束。
4.2 continue语句
continue只有在循环控制语句中使用,表示结束本次循环(循环体中continue后面的所有语句都不在执行),直接进入下一次循环
4.3 return语句
在模块中使用,表示整个函数模块的结束(在函数体中遇到return,函数调用结束)。具体的使用:
1.只表示函数模块的结束,直接使用return ;
2.返回状态:一般情况下使用整型数据表示,0 = 成功;-1表示失败;
3.返回数据处理结果:可以是任意数据类型的数据和指针。
#include <stdio.h>
#include <unistd.h>
int main()
{
int i = 0;
while(i < 20)
{
printf("i = %d\n", i++);
if (i == 6) {
i += 2;
continue; /* 在循环体中continue表示结束本次循环,进入下一次循环 */
}
if (i == 10)
break; /* 在循环体中,表示结束整个循环 */
sleep(1);
}
return 0; /* 在函数模块中使用,表示返回函数的状态 */
}
5. 控制语句关键字
在C语言中控制语句关键字一共有12个
1.选择分支语句关键字
if、else、switch、case、default
2.循环控制语句关键字
for、while、do、goto、
3.特殊语句关键字
break、continue、return
使用随机数生成函数:
#include <stdlib.h>
int rand(void); /* 随机数生成函数,根据随机因子生成随机数 */
void srand(unsigned int seed); /* 随机因子生成函数,相同的seed会生成相同的随机因子,在默认情况下将程序的编译时间生成随机因子 */
#include <time.h>
time_t time(time_t *tloc);
随机数生成实例
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int num;
srand(time(NULL)); /* time(NULL)获取当前时间,srand(time(NULL)) 获取当前时间并用于生成随机因子 */
num = rand();
/* 利用随机因子生成随机数 */
printf("num = %d\n", num);
}
6 复习C语言中的关键字
在C语言中关键字有32个:
1.数据类型关键字:12个
a.基本数据类型
i.整型数据数据(6个)
char 1字节 值域: unsigned char :0 ~ 255; signed char -128 ~ 127;
short 2字节
int 2字节(16位系统) 4字节(32位系统)
long 4字节(32位系统) 8字节(64位系统)
ii.浮点型数据 (2个)
float 4字节 精度范围:小数点后保留6位小数;
double 8字节
b.构造数据类型 (3个)
struct 结构体类型
union 共用体类型
enum 枚举类型
c.特殊数据类型 (1个)
void 不能定义变量。
2.存储类型关键字:(4个)
auto 自动存储类型 所修饰的变量存储栈区;
register 寄存器变量 存储在寄存器中,只能修饰局部变量。并且定义失败默认为auto变量。
extern 外部声明引用 其实质不是用来定义变量,而是做变量的声明。
static 静态
修饰全局变量,改变变量的作用域(或者链接属性);
修饰局部变量,改变变量的生命周期和存储位置。
3.控制语句关键字(12个)
a.选择分支:
if……else……、switch、case、default
b.循环控制
for、while、do、
c.跳转语句
goto
d.特殊功能语句
break、continue、return
4.特殊关键字(4个)
sizeof 运算符关键字,计算数据(常量、数据类型、变量、指针)所占空间的大小。
typedef 数据类型定义关键字,用于新的数据类型定义,或者给已有的数据类型取别名。
#include <stdio.h>
typedef int Int; /* 使用typedef关键字实现数据类型的定义,原型为int */
int main()
{
Int a = 34; /* 定义Int类型的变量a,数据类型是int */
printf("a = %d\n", a);
}
volatile 异变,可变的意思,用来修饰变量。所修饰的变量防止编译器的优化处理
程序运行过程:
程序中所定义的变量在运行的时候存储在虚拟内存中;
程序的运行在CPU的寄存器中运行;
数据会从内存搬移到寄存器中在运行;
编译器优化:
程序在编译的时候,为了提高运行效率,编译器会优化程序(如果需要对同一个数据多次运算,只搬移1次,每次访问寄存器运行)。
防止优化:保证数据可靠,数据的每次运行都从内存中取数据,不要直接从寄存器中取数据。
volatile使用场景:
1.对于寄存器数据访问的时候,主要就对于硬件设备编程。
2.多任务编程的时候,多个任务需要对同一资源数据访问的时候。
const 用来修饰的变量,表示只读变量;
所谓的只读变量,表示为不可以被修改的数据量。在C语言中不能被直接修改,可以间接修改。
#include <stdio.h>
int main()
{
const int a = 34; /* const修饰的变量为只读变量,不能直接修改 */
int *p = &a; /* 定义一个int类型指针变量存储变量a的地址 */
printf("%d : a = %d\n", __LINE__, a);
//a = 123; /* error,const修饰的变量为只读变量,不能直接修改 */
*p = 321;
printf("%d : a = %d\n", __LINE__, a);
}
7 输入输出的实现
在计算机中需要实现数据的输入和输出,使用输入输出函数实现。
7.1 输出函数
#include <stdio.h>
int printf(const char *format, ...);
功能:实现数据的标准输出功能,按照format格式实现输出功能
格式信息:按照%格式字符标记,跟上一个输出数据内容。
利用printf函数可以实现数据的输出,在输出过程中,可以调节输出格式,和输出字体颜色和背景颜色。
7.2 字符输出
int putchar(int c);
功能:将传递的参数c通过标准输出。
7.3 数据的输入
#include <stdio.h>
int scanf(const char *format, ...);
功能:按照format字符串格式进行数据的输入,在输入过程中,严格按照格式输入,接收使用的变量空间地址。
7.4 字符读取
int getchar(void); /* 从表中输入流读取一个字符 */
#include <stdio.h>
int main()
{
int a;
int b;
int c;
int i;
char ch;
scanf("%d %d %d", &a, &b, &c); /* 按照格式输入数据:1 2 3 */
getchar();
/* 字符输入,接收在scanf输入语句结束时回车换行符 */
printf("a = %d, b = %d, c = %d\n", a, b, c);
char buf[4];
for (i = 0; i < 4; i++) {
scanf("%c", &buf[i]); /* 每次输入一个字符 */
getchar(); /* 字符输入,接收在scanf输入语句结束时回车换行符 */
}
for (i = 0; i < 4; i++) {
printf("%c\n", buf[i]); /* 实现字符的输出 */
}
return 0;
}
PS:scanf函数的使用,有严格格式要求,很容易出现bug。