序言
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)关系操作符
关系操作符,顾名思义,就是判断关系的,如是否相等,是否大于 等。
那么,关系操作符有
• > 大于运算符
• < 小于运算符
• >= 大于等于运算符
• <= 小于等于运算符
• == 相等运算符
• != 不相等运算符
这里需要注意几个点
第一,区分=和==的区别,一个是赋值,一个是判断等于,
int a = 10;
if(a=10)
{
printf("是的");
return 0;
}
很多人容易犯这样的错,那么就有的程序员为了防止犯错,就会把变量放在前面
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语言中表达式从左边开始求值,在对右边的表达式求值,这个顺序是雷打不动的。
int a=1;
if(a>=2&&a<=5)
当执行a>=2,结果为假,整个式子结果为0,那么a<=5就不在求值,这种情况称为短路。
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)
{
语句; } 只要表达式结果为真,那么就可以一直循环下去,如图:
while(1)
{
printf("666\n");
}
因为1恒为真,所以这个是个死循环,便会一直打印666。
现在用代码实现打印1到10的数字
这就是while循环的一个应用,当然,while也可以嵌套,下面介绍的for循环也可以嵌套使用。
5
for循环的基本形式是
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语句作用就发挥了,跳出循环也就容易了。
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没什么差别,就不再进行介绍了。
感谢阅读!