Tips:本文主要面向C语言初学者及新手,属于系列文章,笔者借此巩固自身同时也希望帮助更多新人更快的入门,如有不当或错误,欢迎指正。
目录
前言
上一篇文章末尾简单介绍了下编程时的三大基本结构顺序结构,分支结构与循环结构,其核心实际是逻辑思维的转变。本篇文章便继续讲解,上述的三种结构是如何在编程中体现的,涉及if...else语句,switch语句,以及for循环,while循环等基础知识,建议初学者理解并熟练掌握,已经有学习过的读者可以选择速读或者跳过本篇的方式进行学习/复习。
一、顺序结构的体现
顺序结构可以说是在整个程序中都可以体现的到的,因为我们的程序是一步一步自上而下执行,这种执行方式就表明了其为顺序执行。
如上图所示,我们左边的程序是一步步执行,没有任何的跳步等操作,这就是顺序结构体现的一个例子,如果读者感兴趣,可以考虑使用编译器的单步调试功能,看其光标变化情况即可更好体现,此处不做赘述。
二、分支结构的体现
分支结构主要依赖于几个分支语句实现,接下来便对分支语句进行讲解。
1.if语句
if...else语句的基本格式是这样的:
if(表达式)
{
语句块1;
}
else
{
语句块2;
}
if的英文含义是如果,else的英文含义是此外(其他),这样看便更容易理解了。如果if后的表达式成立,那我们便执行语句块1;其他情况便执行语句块2。
例程如下(只显示main函数中内容):
int main(void)
{
int a;
printf("请输入a的值:");
scanf("%d",&a);
printf("a = %d\n",a);
if(a>1)
{
printf("a>1");
}
else
{
printf("a<=1");
}
return 0;
}
其结果如下图:
当然,这只是if语句的基本格式,我们还可以使用,if...elseif...else语句。
if(表达式1)
{
语句块1;
}
else if(表达式2)
{
语句块2;
}
......
else if(表达式n)
{
语句块n;
}
else
{
语句块;
}
此时有读者看到if...elseif...else语句的基本格式,大致就可以明白过来这种分支语句的使用是适合于多种情况时的使用。
例程如下:
此时有读者就可能疑惑了,为什么还要设计else if语句来实现,我多写几个if不也可以实现多种情况执行吗?
其实这也是初学者常见的一个误区, 事实上两者是有细微差别的,可以看一下下面这两个例程:
//此下为if语句例程
int main(void)
{
int a;
printf("请输入a的值:");
scanf("%d",&a);
printf("a = %d\n",a);
if(a>=1)
{
printf("a>=1");
}
if(a==1)
{
printf("a=1");
}
else
{
printf("a<1");
}
return 0;
}
//此下为else if语句例程
int main(void)
{
int a;
printf("请输入a的值:");
scanf("%d",&a);
printf("a = %d\n",a);
if(a>=1)
{
printf("a>=1");
}
else if(a==1)
{
printf("a=1");
}
else
{
printf("a<1");
}
return 0;
}
这个例程的运行结果如图所示:
不难看出,if语句连续使用时是把我们的第一个if语句和第二个if语句的执行语句块都实现了,但是我们再看一下使用else if语句的实现结果:
对比后我们不难发现,else if语句只执行了第一个的if语句里的内容。
所以我们可以明确知道一点,那就是:if满足表达式条件的就会执行,无论之前的其他情况是否满足;但是else if只对未执行过的情况才进行执行。
另外强调几点使用if语句时需要注意的地方:
1.if与else之间不可以有其他内容,否则会导致我们的else无法找到对应的if语句。
error: 'else' without a previous 'if' (此为Qt编译时报错,其他编译软件报错文本内容可能形式不同,但是错误原因是相同的)
2.if可以没有else,但是else不能没有if。错误原因与上文相同,不做赘述。
3.if语句使用时,如果执行语句块为单句,可以将{}省略不写,但是如果超过单句,则会只执行第一句,如若有配套使用else语句,则会提示错误(error: 'else' without a previous 'if' )。
#include <stdio.h>
int main(void)
{
int a;
printf("请输入a的值:");
scanf("%d",&a);
printf("a = %d\n",a);
if(a>=1)
printf("a>=1");
else
printf("a<1");
return 0;
}
//可以如上文所示使用
if嵌套使用
在编程中if语句还常见的一种形式便是嵌套使用。嵌套,字面意思就是将其嵌进去套进去使用,放在if语句中便是,在if中再放一个if。
if(表达式1)
{
if(表达式2)
{
语句块2;
}
else
{
语句块3;
}
}
else
{
语句块1;
}
其执行顺序是:
首先判断表达式1是否成立;
如果成立再判断表达式2是否成立,成立则执行语句块2,表达式2不成立再执行表达式3;
若表达式1不成立则执行语句块1;
理论上我们可以根据需求多次进行if嵌套实现一些功能,但是这并不是最优解决方案,这会导致代码的可读性急速下降,后期维护难度也大大提高,一般我们最多嵌套3层,再多了便会考虑其他方案。
2.switch语句
switch语句的使用实际上也可以说是解决多层嵌套的一个方案,它的基本使用格式是这样的
switch(变量或表达式)
{
case 常量1:语句块1;break;
case 常量2:语句块2;break;
case 常量3:语句块3;break;
...
case 常量n:语句块n;break;
default:语句块n+1;
}
执行顺序:判断switch后面的表达式的结果,和case后的常量相匹配,如果匹配成功,就执行对应的语句块,如果没有匹配成功就执行default后面的语句块,遇到break结束。
例程如下:
int main(void)
{
int a;
printf("请输入a的值:");
scanf("%d",&a);
printf("a = %d\n",a);
switch (a) {
case 1:
printf("a = 1 ");
break;
case 2:
printf("a = 2");
default:
printf("happy new year!");
break;
}
return 0;
}
需要注意的一点是,case后跟的必须是一个常量(不会发生改变的量),它可以是一个数字,一个字符,一个枚举体成员变量(后面会讲解到)等等。
注意:
- 表达式不能是浮点型或字符串
- case后面的break可以省略,但是省略时会顺序执行,直到遇到break结束。
三、循环语句的体现
循环语句在C语言中主要依赖循环语句实现,例如for循环以及while循环。
1.for循环
for循环的基本形式如下
for(表达式1;表达式2;表达式3)
{
语句块;
}
表达式1:赋初值
表达式2:循环的终止条件
表达式3:增值或减值
执行顺序:
首先执行表达式1先进行赋值,然后判断表达式2是否成立,如果成立就进入循环执行语句块,再执行表达式3进行增值或减值然后继续判断表达式2是否成立,直到表达式2不成立退出循环
例程如下:
#include <stdio.h>
//打印输出小于10的所有数字
int main(void)
{
int i;
for(i = 0;i<10;i++)
{
printf("%d ",i);
}
return 0;
}
同样的,for循环使用时亦可以去掉{}约束,但是也是只执行for循环下的第一句语句。
另外需要了解for循环的几种变种形式:
变形一:
int i=0;
for(;表达式2;表达式3)
{
语句块;
}
变形二:
int i=0;
for(;表达式2;)
{
语句块;
表达式3;
}
变形三:
int i=0;
for(;;) <-------此为死循环
{
if(表达式2)
{
语句块;
表达式3;
}
else
{
break;
}
}
另外也会有读者见到这类写法
for(int i =0;i<10;i++)
该类写法并没有错误,只是将循环变量在局部声明定义,如若只是局部函数使用或者main函数单纯作为循环变量是完全没有错误的,但是如果是局部变量需要在其他函数或者全局使用则会表明未声明定义,使用时需要留意。(部分ide默认编译是采取的gcc的c89标准,而该类方式是在c99标准中采取的,只需更改编译标准即可)
for循环嵌套
for循环同if类似,也有嵌套使用的方式,其基本格式如下
for(表达式1;表达式2;表达式3){
for(表达式4;表达式5;表达式6)
{
语句块;
}
}
其循环是表达式1赋值后,通过表达式2判断,成立则进入内层循环,将内层循环全部执行完后再执行外层的表达式3,然后再对表达式2进行判断,成立再进入内层循环全部执行完成后,再对表达式2判断........直到表达式2不成立,整个循环结束。
同样的,我们也不建议使用过多的for循环嵌套,一般也是三层嵌套以下。
2.while循环
while循环使用起来最为方便,其格式最为简单
while(判断条件){
语句块;
增值或减值语句;
}
例程:
//打印输出小于10的数字
int main(void)
{
int i = 0;
while(i<10)
{
printf("%d ",i);
i++;
}
return 0;
}
while后面的判断条件既可以是表达式,也可以是单独的一个变量或者常量,我们常用的死循环便是采取的while(1)这类一个常量实现的。
总结
本文讲解了三大基本结构在编程中如何体现,从而引出了分支语句与循环语句的讲解,若是读者有印象,便可以理解本次讲解的if语句,while语句等的判断条件其实返回的都是一个布尔值(bool),若是返回的是一个非0值(即为true)则会执行我们的内容;若是返回的是一个false,则不会执行,跳出我们的分支语句/循环语句。读者也可以理解为,日后接触到的绝大多数判断返回的都是bool。下一篇将会是对数组的详细讲解,欢迎持续关注。