C语言是结构化的程序设计语言,结构包含顺序结构,选择结构,循环结构。生活中日常所见的事都能拆分为这三种结构的组合。
分支结构
if语句
if语句的语法形式
#include <stdio.h>
int main()
{
if (表达式)
语句1
else if (表达式)
语句2
else
语句3
return 0;
}
表达式成立(或为真)则语句执行,若不成立(或为假)则语句1不执行。此外在C语言中,0为假,非零表示真,因此表达式返回的数字结果也能判断真假。
分支中包含多条语句和if嵌套
如果if后面控制着多条语句,则需要用{ }将要执行的语句括起来,else后面也能用大括号。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)
printf("输⼊的数字是0\n");
else if(num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构
printf("输⼊的数字是正数\n");
else
printf("输⼊的数字是负数\n");
return 0;
}
有了这种嵌套语句,就可以实现复杂的逻辑判断
悬空else问题
如果有多个if和else,那么else总是和最近的if匹配(就近原则)例如:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("dadada\n");
else
printf("lalala\n");
return 0;
}
程序的结果是什么都不打印,因为第一个if判断为假,而且第二个if是嵌套在第一个里面的,所以嵌套的if就不能执行。为了避免这种容易让人产生误解的情况发生,应该用大括号标明if语句的控制范围或者写注释,提升代码的可读性。
关系操作符
既然在if提到了表达式,那么就不得不介绍一下C语言中的关系操作符了。其中包括但不限于:>,<,>=(大于等于),<=(小于等于),==(等于),!=(不等于)。
注意:“=”并不等于“==”,前面那个是赋值操作符,后面那个是相等操作符,千万不可混淆!
关系表达式的返回结果通常是0(关系判断为假)和1(关系判断为真),并且计算方向为从左到右
因此关系表达式不宜连用,就比如“20>15>10”这个式子,从平常的角度看没有任何问题,但是在C语言中它会先判断20>15这个式子,为真,返回1,然后式子就变成了1>10,为假,返回0。所以在多个关系表达式要同时连用的话通常会用到逻辑操作符
逻辑操作符
或:|| —>两侧至少有一个关系式为真,则输出的结果为真
且:&& —>两侧只要有一个关系式为假,则输出的结果为假
非:! —>改变单个表达式的真假
所以上面那个例子应该写成20>15 && 15>10。
在逻辑操作符中有一个现象叫短路,就是判断完一边就已经知道结果而提前结束判断的情况。例如在“&&”操作符的左边的关系表达式为假,系统就不会判断右边,提前结束并且输出结果为假,在“||”操作符的左边的关系表达式为真,系统就不会判断右边,提前结束并且输出结果为真。
switch语句
switch语句是一种特殊的if…else语句,它的可读性更好但使用范围也有限,使用格式如下
switch (表达式)
{
case 结果1:
语句1;
break;
case 结果2:
语句2;
break;
default:
语句3;
break;
}
上面的代码中,根据表达式中返回的结果的不同,执行相应的case分支,如果找不到相应的值,则进入default分支。
注意:switch后面表达式必须是整型表达式;case后面的值,必须是整型常量表达式,case和后面的数字之间必须有空格,每一条case语句结束后必须要加一个break来跳出switch语句
switch语句中的break
如果case语句中没有break来跳出分支,那么会出现什么情况,请看代码
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
return 0;
}
如果输入了4,那么应该打印出“余数是1”和“余数是2”,这就是没有break的缘故,没有break,那么进入到一个case分支后不会主动跳出,会顺着程序执行下去
switch语句中的default
在switch语句中,可能会遇到switch后面的值与case语句不匹配的情况,这时候要不不做处理,要么就在语句中加入default语句,这条语句理论上可以放在switch语句中的任意地方。
循环结构
while循环
while语句的基本形式和if语句的基本形式类似
while (表达式)
语句; //如果有更多的语句,那么要加上大括号
实践:在屏幕上打印1-10的数
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10) //i<=10时会循环下去,如果i>10那么循环将终止
{
printf("%d ", i);
i = i+1;
}
return 0;
}
for循环
for循环是三种循环语句中用的最多的,其基本形式如下:
for (循环变量的初始化;循环结束条件的判断;循环变量的调整)
实践:在屏幕上打印1-10的数
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
do while循环
do while循环语句使用的最少,其基本形式如下:
do
语句;
while (表达式)
while和for循环都是先判断条件,条件满足则进入循环,如果不满足就跳出循环,而do while语句直接进入循环体再执行while后面的判断表达式,表达式若为真则进行下一次,若为假则不再循环。所以do while循环的循环体至少是执行一次的
实践:在屏幕上打印1-10的数
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i + 1;
}while(i<=10);
return 0;
}
循环语句中的break和continue语句
在循环执行的时候,如果某些特殊情况发生时,需要提前终止循环,这是非常常见的现象,break和continue就是运用到循环语句中的
braek:永久的终止循环,一旦break被执行,直接跳出循环,继续向后面的程序执行
continue:跳过本次循环continue后面的代码,在for循环和while循环中有差异
循环的嵌套
利用好循环的嵌套能解决一些更复杂的问题
实践:在屏幕上打印出九九乘法表
#include <stdio.h>
int main()
{
int a, b,c;
for (a = 1; a < 10; a++) //循环产生1-9
{
for (b = 1; b <= a; b++) //循环产生比a小的数字
{
c = a * b;
printf("%d * %d =% d ", a, b, c);
}
printf("\n");
}
return 0;
}
goto语句
这是一种特别的语法,goto语句可以实现在同一个函数内跳转到设置好的标号处
#include <stdio.h>
int main()
{
printf("熊大\n");
goto 123:
printf("熊二\n");
123:
printf("光头强\n");
return 0;
}
在这个代码中,当程序执行到goto语句时,就会跳转到对应名字的那一行继续执行,“熊二”不会被打印出来。
注意:goto语句的使用要恰当,如果一个程序内有很多goto语句那么会显得很混乱,可读性不强