结构化的程序
算法
在编程的过程中,为了实现特定功能,我们的程序往往是按照特定的流程执行的,我们将对应的流程称为算法
算法主要有两个重要的组成成分
- 需要执行的操作
- 执行操作的顺序
对于操作的执行顺序的设计称为程序控制
赋值运算
基本赋值运算
形如
a=b+c
将'='右侧的计算结果赋给左侧
复合赋值运算
a+=b 等价于a=a+b
a-=b 等价于a=a-b
a*=b 等价于a=a*b
a/=b 等价于a=a/b
a%=b 等价于a=a%b
a++ 等价于a+=1 等价于a=a+1
++a 等价于a+=1 等价于a=a+1
a-- 等价于a-=1 等价于a=a-1
--a 等价于a-=1 等价于a=a-1
对于a++和++a在单独使用时没有区别,但当二者作为参数时
a++是将自增前的值作为参数传递,然后进行自增,称为后增
++a是先自增,然后将自增的结果作为参数传递,称为先增
自减的区别与自增类似
你可以运行一下这段代码来验证
#include <stdio.h>
int main(void ) {
int a=0;//初始化变量
printf("%d\n",a++);//打印后增
a=0;//初始化变量
printf("%d\n",++a);//打印先增
a=0;//初始化变量
printf("%d\n",a--);//打印后增
a=0;//初始化变量
printf("%d\n",--a);//打印先增
}
逻辑运算
控制结构
控制结构分为三大类:顺序结构,分支结构,循环结构,在程序控制中灵活运用这三种结构是非常重要的,合理的结构控制可以降低程序的时间复杂度和空间复杂度,提高程序的运行效率
顺序结构
顺序结构是指在没有强制要求改变程序执行顺序的情况下,计算机按照程序被编写的顺序依次执行,是最简单的程序控制
之前的代码都是顺序执行的,即从上到下的顺序执行
#include <stdio.h>
int main(void ) {
printf("第1个语句\n");
printf("第2个语句\n");
printf("第3个语句\n");
printf("第4个语句\n");
}
在这段示例代码中四个输出语句依次执行,是顺序结构
分支结构
分支结构,也被称为选择结构,是C语言中用于控制程序流程的重要机制。它允许程序根据某个或某些条件的真假来选择性地执行不同的代码块。
在上一篇中我们提到了关系运算表达式通常作为分支和选择的条件,根据表达式的结果来决策程序操作的执行顺序
分支语句有三种
- if
- if--else
- switch
if分支
if语句又称为单分支条件语句,用于选择或者忽略一个操作
语法为
if(条件){
语句体
}
当我们的关系运算表达式值为真时,执行if语句后的语句体,否则忽略语句体
#include <stdio.h>
int main(void ) {
if(1){
printf("条件为真\n");
}
if(0){
printf("条件为假\n");
}
}
在示例代码中,第一个if语句条件为真,所以第一个语句体执行,第二个if语句条件为假,语句体被忽略
if--else分支
if--else分支又称为双分支条件语句
if(条件){
语句体1
}else{
语句体2
}
与if分支不同的是,if--else分支多了一个else分支,当条件为真时,执行语句体1,反之执行语句体2
#include <stdio.h>
int main(void ) {
if(1){
printf("条件1为真\n");
} else{
printf("条件1为假\n");
}
if(0){
printf("条件2为真\n");
} else{
printf("条件2为假\n");
}
}
示例代码输出结果为:
条件1为真
条件2为假
if--else分支是可以嵌套的,为了便于观察,嵌套后的分支有专用的表达形式:if…else if…else
if(表达式1)
{
语句体1
}
else if(表达式2)
{
语句体2
}
else if(表达式3)
{
语句体3;
}
//… …
else
{
语句体4
}
对应流程图如下
在当表达式满足时执行if后的语句体,否则执行else语句体,若else后的语句体是一个if语句则重复这个操作
switch--case分支
当我们的分支数量大于3时,使用if类型的分支语句就会使代码变得复杂,可读性下降,这时使用switch--case分支来进行编写可以很好的解决这个问题
switch(表达式)
{
case 常量表达式1:{语句体1}
break;
case 常量表达式2:{语句体2}
break;
case 常量表达式3:{语句体3}
break;
// ……
case 常量表达式n:{语句体n}
break;
default:{语句体n+1}
break;
}
在switch--case语句的语法中我们通过输入的表达式的值来决定所走的分支,当表达式的值与case后的常量表达式的值相等时,运行其后面的语句体,
在每一个语句体后面都有一个break语句用来终止switch分支,否则程序在执行完当前分支后将继续执行当前分支的下一个分支,我们把这个现象叫做switch击穿.
default是用来进行兜底的,如果你的表达式的值没有一个对应的分支相匹配,那么就会执行这个默认的分支进行兜底
以上便是三种分支语句
三元运算符
在c语言中还有一种与if--else功能类似的语句称为三元运算,三元运算可以通过判断条件来确定三元运算的结果
判断条件?真值结果:假值结果
当出现三元运算时,若判断条件为真,则结果为真值的结果,反之为假值结果
#include <stdio.h>
int main(void ) {
int a=10;
int b=20;
printf("%d",a>b?a:b);
}
上面代码举例来说
对于判断条件a>b很明显为假,所以三元运算 a>b?a:b的结果为b
所以输出语句等价于
printf("%d",b)
即输出结果为20
三元运算也可以用于赋值,如
#include <stdio.h>
int main(void ) {
int a=10;
int b=20;
int c = a>b?a:b;
}
循环结构
循环结构允许程序在执行过程中重复某些操作直到达到特定的条件为止
循环结构有三大特性
- 重复性:在循环结构中,总有一个过程需要重复执行一系列的步骤若干次,而且每次的操作都是完全相同的。
- 判断性:每个循环结构都包含一个判断条件,用于决定循环的执行与终止。循环结构中的循环体是否执行,取决于判断条件是否成立。
- 可终止性:循环结构的循环体要根据条件是否成立才执行。因此,在判断框中的条件在循环体中要有所改变,否则循环体可能不执行或无限期执行(形成死循环),这不符合程序设计的要求。
与分支结构类似,循环结构需要一个关系运算表达式来进行决策是否要继续循环
循环语句分为
- while
- do--while
- for
while
while语句是最简单的循环语句,是入口条件循环,使用方法如下
while (关系运算表达式){ 语句体 }
当运行到while循环语句时,先进行条件判断,当关系运算表达式的结果为真时,运行语句体,然后重新进行条件判断,如果结果为假则跳过语句体执行,结束while循环
由流程图可以看出,while循环是先判断后执行的
#include <stdio.h>
int main(void ) {
int a=0;
while (a<0){
printf("%d\n",a);
a=a+1;
}
}
在这一段代码中,我们的while循环没有运行,因为判定条件不通过
#include <stdio.h>
int main(void ) {
int a=0;
while (a<3){
printf("%d\n",a);
a=a+1;
}
}
在这段代码中,首先判定条件为真,运行语句体,当进行了3次循环后,判定条件无法满足,循环被退出
do--while循环
do--while循环与while循环不同的是do--while循环会先执行语句体后判断,是退出条件循环
语法如下
do { 语句体 } while (判断条件);
当运行到do--while循环时,先执行语句体,后进行条件判断,如果结果为真,则重新执行语句体和进行条件判断,如果结果为假,则结束循环,do--while保证了语句体至少被运行一次
#include <stdio.h>
int main(void ) {
int a=0;
do {
printf("我运行了");
} while (a>0);
}
很明显a=0不符合判定条件,但是语句体依然执行了,说明do--while循环是先执行后判断
for循环
for循环是一类特殊的入口条件循环,允许在语句中进行变量处理,一般用于限定循环的次数
for(初始化表达式;条件判断语句;条件控制语句) {
循环体语句
}
在初始化表达式中可以定义变量,作用域是在这个for循环
条件判断语句可以用于判断是否继续进行循环
条件控制语句可以用于变量处理
在开始for循环时,首先进行变量初始化,然后进行循环判断,结果为真执行语句体,然后执行更新表达式,最后重新开始for循环的条件判断,若循环判断结果为假则退出循环
goto
这是一种异常灵活的跳转语句,但是由于频繁的使用goto导致代码的可读性严重下降已经不被推荐使用,如果你感兴趣的话这里有相关资料
break和continue
break和continue可以改变程序的控制流
break语句在while,do--while,for,switch语句中使用会导致程序从这些语句中退出,执行while,do--while,for,switch后的下一条语句
#include <stdio.h>
int main(void ) {
int a=1;//初始化变量
while (a){
printf("我执行了\n");
break;
printf("我被忽略了\n");
}
}
continue语句在while,do--while,for语句中使用会让程序忽略剩余的循环体,转而进入新一轮循环
#include <stdio.h>
int main(void ) {
for (int i = 0; i < 10; ++i){
printf("我执行了\n");
continue;
printf("我被忽略了\n");
}
}