目录
1. C语言分支和循环语句的简介
C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种结构的组合。
1.1 顺序结构
C语言中的代码执行的顺序就是按照顺序结构开始执行的。在C语言中从主函数开始执行。
1.2 选择结构
选择结构在C语言中通过if语句和switch语句实现。具体是通过进行条件的判断进行选择。
1.3 循环结构
循环结构在C语言中使用for,while,do while语句实现,在满足判断条件的情况下,使计算机反复循环做同一件事。
2. 分支与循环语句
2.1 if 语句
(1)if()
if语句的语法形式如下:
表达式成立(为真),则语句执行,表达式不成⽴(为假),则语句不执⾏。在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。
if语句执行流程:
(2)if()...else...
if...else语句的语法形式如下:
如果表达式为真则执行语句1,如果表达式为假则执行语句2。语句1和语句2只能执行一个。
(3)分支中包含多条语句
默认在 if 和 else 语句中默认都只控制⼀条语句,若想执行多条语句在一个判断条件下,则加上大括号{},比如:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age); //输入age的值
if (age >= 18) //if后使用{}控制多条语句-这个块也叫:程序块,或者叫复合语句
{
printf("成年了\n");
printf("可以变成社畜了\n");
}
else
{
printf("未成年\n");
printf("还得学\n");
}
return 0;
}
(4)if()...else if()...else...
if()...else if()...else语句则为在if...else...语句中嵌套if语句,构成多重判断。并且可以多重嵌套,else if()可以多次使用.语法形式如:
(5)悬空else问题
如果有多个if和else,可以记住这样一条规则,else总是和最接近得if匹配。为了代码的可读性,最好还是将匹配的if和else写成同样的缩减。
2.2 switch 语句
(1)switch语句
除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。语法形式如下:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
上述代码中,case和后面的数字之间必须有空格,每个case语句中的代码执行完成后,需要加上break才能跳出这个switch语句,不然就会跟着顺序执行后面的语句。
(2)switch语句中的default
2.3 while循环语句
(1)while语句的执行流程
首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
(2)while循环的实践
在屏幕上打印1-10的值:
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i = i + 1;
}
return 0;
}
注:在循环体中需要使其越来越接近循环跳出条件,不然程序会进入死循环,列如上述的i = i + 1。
2.4 for 循环语句
(1)for循环语法形式
for循环是三种循环中使用的最多的,语法形式如下:
(2)for循环的执行流程
(3)for循环的实践
在屏幕上打印1-10的值:
#include <stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
for和while循环在实现循环的过程中都有初始化、判断、调整3个部分,但是for循环相对集中,便于代码的维护,而如果代码较多的时候while循环的三个部分就比较分散,所以从形式上for循环更优一点。
2.5 do while 循环语句
(1)语法形式
do while循环是先进入循环体,执行循环语句,然后再执行while后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。
(2)do while循环的执行流程
do while循环语句中的循环体至少执行一次,这是它比较特殊的地方。
3. 猜数字游戏
(1)游戏要求
1.电脑自动生成1-100的随机数
2.玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或者小了的反馈,直到猜对,游戏结束。
(2)参考代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("*****************\n");
printf("*****1.play******\n");
printf("*****0.exit******\n");
printf("*****************\n");
}
void game()
{
int r = rand() % 100 + 1; //利用rand函数生成随机数,对100取余数得到0-99的数字,加1则为1-
int guess = 0; //100的随机数
while (1)
{
printf("请猜数字:");
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了\n");
}
else if (guess > r)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); //用来初始化随机数的生成器,调用rand前先调用srand,
do //time函数获得当前的时间作为srand函数的seed
{
menu(); //调用menu函数打印出游戏菜单
printf("请选择:");
scanf("%d", &input);
switch (input) //当input == 0时直接退出游戏
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input); //循环是为了玩了一局之后不退出游戏,当input == 0时直接退出循环,退出游戏
return 0;
}
4. 关系操作符
C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称为“关系运算符”(relational operator),主要有下⾯6个。
(1)>:大于(2)<:小于(3)>= 大于等于(4)<=:小于等于(5)==:等于(6)!=:不等于
关系操作符常用于上述的分支和循环语句中作为判断条件。
使用关系运算符的时候,如果成立则为真,返回 1,如果不成立则为假,返回 0,所以关系运算符不宜连用,因为会从后到前依次进行关系运算,当最右边的一个关系运算符运算完,则和它之前的数进行比较的时候,要么是 0 要么是 1.
#include <stdio.h>
int main()
{
printf("表达式为真: %d\n", 1 < 2);
printf("表达式为假: %d\n", 1 > 2);
return 0;
}
注:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。
5. 条件操作符
条件操作符也叫三⽬操作符,需要接受三个操作数,形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
b = a > 5 ? 3 : -3;
printf("%d\n", b);
return 0;
}
如上述代码,当输入的值大于 5 时,b = 3,当输入的值不大于 5 时, b = -3。
6. 逻辑操作符
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。
(1)! :逻辑取反运算符(改变单个表达式的真假)。
(2)&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
(3)|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
6.1 逻辑操作符的短路问题
C 语⾔逻辑运算符有⼀个特点,总是先对左侧的表达式求值,再对右边的表达式求值。如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
printf("i = %d\n", i);
return 0;
}
如上述代码,执行 i = a++ && ++b && d++ 时,先执行 a++ 返回值为 0,与运算中第一个表达式为假,则不执行后续代码,i 为其与运算的结果,所以 i = 0。
7. break 和 continue
在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环。则 C 语⾔中提供了 break 和 continue 两个关键字。
break:⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环。
continue:用于跳过本次循环 continue 后边的代码重新从循环体开始处开始执行。
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;//当i等于5后,就执⾏break,循环就终⽌了
printf("%d ", i);
i = i + 1;
}
return 0;
}
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue; // 当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
// 因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环
printf("%d ", i);
i = i + 1;
}
return 0;
}
8. goto 语句
C 语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号,goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出使⽤ goto 就⾮常的⽅便了。