前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初识C语言·3(分支与循环·上)

初识C语言·3(分支与循环·上)

作者头像
_lazy
发布2024-10-16 14:47:52
510
发布2024-10-16 14:47:52
举报
文章被收录于专栏:Initial programming

序言

C语言是结构化的语言,结构指的是顺序 选择 循环,C语言中的代码无非就是这三种的组合,

实现分支的是if switch 实现循环的是for while do-while。

1

if语句,基本形式是

if是如果的意思,C语言中,0为假,非0是真,所以表达式的结果如果是0,那么语句不执行,反之同理。

比如,判断一个数是否为奇数,如下

通常来说,一个数不是奇数就是偶数,所以 else语句就登场了,else是其他的意思

那我如果写这样呢?

本意是想要在if判断成功后打印两句话的,但是VS对此进行了报错。

这是因为就if在没有大括号的情况下,只能控制一条语句,else也是,那么,试试?

看来成功了。

值得注意的是if()后面是没有英文分号的,同理,for循环while循环后面也没有,do-while的while后面有分号。

实际问题是有多种情况的,那么if能实现吗,我看能!

现在实现一下输入一个数字是正负还是0(三种情况)

可以看到多了else if,那么else if在后面也是要加判断条件的,else后面不加条件,else if可以存在多个,这就是if else的使用,当然,if也是可以嵌套使用的,比如先判断是不是正数,再判断奇偶。

输⼊⼀个⼈的年龄 ,如果年龄<18岁,打印"少年" ,如果年龄在18岁至44岁打印"青年", 如果年龄在45岁至59岁打印"中老年", 如果年龄在60岁至89岁打印"老年" ,如果90岁以上打印"老寿星"

同样可以用多个else if实现,也可以用嵌套if实现,这里不做演示。

还有一个值得注意的问题是,如果存在多个if,只有一个else,那么这个else和哪个if进行匹配呢? 上代码

为什么会出现两个结果呢?这是因为else和if的匹配规则,else只和离它最近且没配对的if进行匹配。所以平时要养成好的代码风格,不然代码一多,还真不容易看出来。


2

正如上篇文章所说,操作符很多很多,那么这篇文章介绍三种操作符,一个是关系操作符,一个是条件操作符,还有一个是逻辑操作符

1)关系操作符

关系操作符,顾名思义,就是判断关系的,如是否相等,是否大于 等。

那么,关系操作符有

• >  大于运算符

• <  小于运算符

• >= 大于等于运算符

• <= 小于等于运算符

• ==  相等运算符

• !=  不相等运算符

这里需要注意几个点

第一,区分=和==的区别,一个是赋值,一个是判断等于,

代码语言:javascript
复制
int a = 10;
if(a=10)
{
    printf("是的");
    return 0;
}

很多人容易犯这样的错,那么就有的程序员为了防止犯错,就会把变量放在前面

代码语言:javascript
复制
int a = 10;
if(10==a)
{
    printf("是的");
    return 0;
}

这样犯错率就要低一点。

第二,关系操作符运算结果是0和1,即不成立就返回0,成立就返回1。

第三,关系操作符不要连用,否则极易出现问题,如图

可以看到实际结果是没有输出111的,这是因为计算机先执行0<a,不等式成立,返回1,然后1<0.1,不等式不成立,所以printf语句没有执行。那么怎么进行多次的比较呢?且看逻辑操作符。

2)条件操作符

这个在上一篇文章已经进行了介绍,条件操作符是三目操作符,是C语言中唯一的一个三目操作符,它的一般写法为(exp 1 ? exp 2 ; exp 3),表达式1结果为真就执行表达式2,结果为假就执行表达式3。

这里不过多介绍。

3)逻辑操作符

逻辑操作符有&&   ||   !这三个,分别是逻辑与   逻辑或    逻辑取反

前两个与生活无异,就是并且和或者的意思,那么就是说&&两侧的条件需要同时成立才算真,||两侧的条件只要满足一个就算真。

就上面的例子写代码,

当然,可以有多个&&,多个||,&&和||也可以放在一起使用。这里不做演示。

逻辑取反,挺像颠倒黑白的,把假变成真,真变成假

a原来是0,经过取反之后就变成了1,所以执行printf语句。

逻辑操作符还有一个显著的特点是“短路”

C语言中表达式从左边开始求值,在对右边的表达式求值,这个顺序是雷打不动的。

代码语言:javascript
复制
int a=1;
if(a>=2&&a<=5)

当执行a>=2,结果为假,整个式子结果为0,那么a<=5就不在求值,这种情况称为短路。

代码语言:javascript
复制
int a = 10;
if(a==10||a==11)

a==10成立,结果为1,那么整个式子的结果就知道是1了,a==11就不再运算。

所以这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。

如图,i的值就是1。


3

switch语句,switch语句用于多分支的情况,欸?if语句好像也可以

那么在相同的题目下我们看一下效果,输入1—7的数字,是即就输出星期几。

在这里我个人认为switch写起来是比较舒服的。在较多分支的情况下,switch较为简洁,代码更直观。

那么现在依次介绍switch里面出现的代码:

switch (expression)

{

case value1: statement

case value2: statement

default: statement

这是它的基本形式,expression里面的只能是整型表达式,case后面的只能是整型常量表达式,比如case 1+2也是可以的。那么statement是语句。

default,如果expression的值不满足所有case后面的值就会执行default语句。

最基本的框架就是这样,那么,该介绍细节了。

1)break,刚才的代码每个语句的后面都有break,那么没有break会怎么样呢?试试

a的值是3,那么从case 3开始,但是没有break,所以代码会从case 3开始执行,一直到default语句结束,所以break的作用显而易见,用于跳出switch的。

2)如果多种输入是一样的输出结果,那有必要每个case后面加上相同的语句吗?试试

欸?好像没有必要,这也是switch的一个优势。顺带提一句,default的break其实可加可不加,为了统一倒是可以加上。

3)顺序问题 无论是default还是case,顺序都是没有规定的,所以这样放也是不会影响运行的。

但是通常都是把default放在后面,不要问为什么,问就是你猜。


4

while循环

基本格式是

while(exp)

{

语句; } 只要表达式结果为真,那么就可以一直循环下去,如图:

代码语言:javascript
复制
while(1)
{
    printf("666\n");
}

因为1恒为真,所以这个是个死循环,便会一直打印666。

现在用代码实现打印1到10的数字

这就是while循环的一个应用,当然,while也可以嵌套,下面介绍的for循环也可以嵌套使用。


5

for循环的基本形式是

代码语言:javascript
复制
for(exp1;exp2;exp3)
{
    语句;
}

exp1是变量的初始化,exp2是判断条件,exp3是调整语句。

与while循环不同,while循环的三个表达式相对来说可能相隔比较远,for更直观,所以for循环用到的次数也是最多的。

那么,现在用for循环打印1-10的数字

它执行的顺序是exp1—>exp2—>语句—>exp3—>exp2—>语句—>exp3重复执行下去

当然,for的三个语句是可以省的,比如,

关于其他两个,亲请自行尝试哦。


6

do-while循环

顾名思义,先做一次再看看是否满足循环条件,不满足的话就不执行咯。

但是在实际用的时候do-whiie循环用的比较少。

那么现在用do-while语句打印1-10的数字。


7

goto语句,这个语句如果使用不当就很容易造成代码乱跳,从而导致错误。

但是在多层循环中,goto语句作用就发挥了,跳出循环也就容易了。

代码语言:javascript
复制
for(...)
{
    for(...)
{
    for()
{
    for()
{
        for()
{

        goto error;
}
}
}
}
}
errror:
语句

能不使用还是不要使用goto语句了


8

ok,循环中的老大上场了 ,break和continue语句。

break和continue都是C语言提供的关键字,在循环执行的时候,如果发生了某种特殊情况需要终止循环,那么这两个就该上场了。

是的你没有听错,continue也可以用来终止循环,诧异吧?我也诧异。

break作用是永久的终止循环,直接跳出循环体

continue作用是跳过本次循环continue后面的代码,在for循环和while循环中有所差异

1)

while循环中的break和continue

break很好理解,continue的代码死循环了,这是因为到continue的时候,跳过了i++的代码,所以i一直等于5,那么就会一直死循环。

所以如果循环调整的部分如果在continue之后的话,可能会导致死循环。

2)

for循环中的break 和 continue

break的作用是一样的,就不举例了,主要是continue的差异

上代码

看,这就是调整语句位置的不同造成的差异。

do-while的break和continue和break没什么差别,就不再进行介绍了。

感谢阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档