C语言是结构化的程序设计语言——顺序结构、选择结构、循环结构;
分支语句:if、switch
循环语句:for、while、do while
goto 语句
一、语句
C语言语句共有如下五类:
3 + 5; //表达式语句
printf("hehe"); //函数调用语句
; //空语句
{语句1;语句2;...}// 复合语句
// 控制语句 —— 用于控制程序的执行流程,以实现程序的各种结构方式;
控制语句可分为如下三类:
- 条件判断:if、switch
- 循环执行:while、do while、for
- 转向语句:break、goto、continue、return
二、if 语句
if (表达式1)
{语句1;} —— 表达式1为真执行
elseif (表达式2)
{语句2;}
else
{语句3;} // if、elseif、else默认只能管后面一条语句,因此最好加上大括号;
// 如果存在多个if,else又没有打括号的情况,else与离它最近的if匹配;
推荐书籍:《高质量C++编程指南》;
代码规范:表达式如果是判断相等,少写一个等号就变成赋值,此时表达式恒为真,且不容易被查出,好习惯是“常数 == 变量”这种形式,如果少了一个等号,编译器会直接报错,减少bug流出;
三、switch 语句
switch(整型表达式)
{
case 整型常量表达式: // 程序从“整型表达式 == 整型常量表达式”开始执行一直到}为止
语句; // 如果想只执行对应语句,需要在语句的后面加break
// case决定入口,break决定出口,如果没有就到}
default: //如果整型表达式和整型常量表达式没有匹配上,就运行default后面的语句
语句; // default没有规定一定要放在最后面
}
四、while 循环
while(表达式) // 表达式为真执行循环语句;
循环语句; // 循环语句遇到break立即停止整个循环,遇到continue不运行之后的代码,直接执行下一次循环;
3.1 while循环在输入/输出中的应用
int getchar()从标准输入(键盘)中读取一个字符,返回ASC II码的值,如果读取失败【ctrl+z会读取失败】返回EOF(-1)【end of file】; putchar(int)与之对应为将int对应的ASC II码的字符输出到标准输出流(屏幕)上;
int main()
{
char password [20] = {0};
scanf("%s", password);
printf("确认否,Y/N");
char input = 0;
scanf("%c", input);
if ('Y' == input)
printf("确认成功");
else
printf("确认失败");
// 此代码有bug,系统不会二次等待输入Y/N
//而是会从输入缓冲区读取password后面的‘\n’确认永远失败
//改进方法为在读取input之前加入
//while(getchar() != '\n'){;}
return 0;
}
五、for 循环
for(循环变量初始化;循环判断条件;循环变量的调整) // 优点就是把这三个放在一起,不容易出错
{循环语句;}
// continue和break与while()中使用的相同
建议:1)不可在循环体内修改循环变量,防止循环失控;
推荐书籍:《明解C语言——入门篇》
// for 循环的变种
for (;;) {循环体;} // 此语句为死循环
// 初始化和调整省略就是什么都不做,如果是判断省略了就是判断恒为真
六、do while 循环
do
循环语句;
while (表达式);
// continue 和 break 用法与其它循环一致;
// 先执行再判断,使用场景有限,不经常使用。
扩展:
- 左值 == 内存空间;右值 == 内存空间存的内容;
- 想要有缓冲用Sleep(时间ms)程序会等待(时间ms)后继续运行;
- system(“命令”)函数可以执行系统命令,如system(“cls”)清屏;
- 字符串比较相等用strcmp(字符串A,字符串B)返回0那么A==B,返回>0的数字表示A>B,返回<0的数字表示A<B;
- 字符串长度建议用strlen()函数,会自动去掉最后'\0'的长度;
- rand()函数在使用之前需要调用void srand(unsigned int)初始化随机生成器,其中unsigned int传入time()返回的时间戳比较合适,即srand(time(NULL))。注意srand一次只要调用一次,即初始化一次就行。
七、goto 语句
goto语句最好的用场景是跳出深层嵌套循环,不用多个break,直接跳到想去的地方;
int main()
{
标识符:
...
goto 标识符; //运行到这里以后跳到标识符那里,从标识符那里开始运行
return 0;
}
注意:goto语句是不能跨函数的;
// goto应用示例
#include <stdlib.h> // system()
#include <string.h> // strcmp()
int main()
{
char input[20] = {0};
system("shutdown -s -t 60"); //执行系统命令关机,设置,时间,60秒
again:
printf("请注意你的电脑将在一分钟内关闭,如果输入\"我不关机\",则取消关机");
scanf("%s\n", input); //数组名就是地址,因此在这里input不用取地址
if (strcmp(input == "我不关机") == 0)
system("shutdown -a");
else
goto again;
return 0;
}