1.if语句
1.1 if
if语句的形式如下:
表达式为真则语句执行,表达式为假则语句不执行。在c语言中,0为假,非0为真,也就是说如果表达式的结果为0,则语句不执行,表达式的结果如果不是0,则语句执行。
例子:输入一个整数,判断是否为奇数
1.2 else
if...else...语句表达形式:
例子: 输入一个整数,判断是否为奇数,如果是奇数打印奇数,否则打印数偶数。
练习:输入一个年龄,>=18岁就输出:成年,否则就输出: 未成年
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age>=18)
printf("成年\n");
elae
printf("未成年\n”);
return 0;
}
1.3 分支中包含多条语句
if和else语句中默认都只控制一条语句,如果要控制多条语句 就要加{},如果控制多条语句不加{}则会出现如下情况:
这是因为printf(“可以谈恋爱了”)不受if语句的控制,独立存在,不管if语句是真是假都会被执行因此要用{},正确示范如下:
1.4 嵌套if
在 if else 语句中,else 可以与另一个if 语句连用,构成多重判断。
比如:要求输入一个整数,判断输入的整数是0,还是正数或者负数。请看如下代码:
上图灰色背景的代码就是嵌套在前面的else子句中,构成嵌套的if语句。
1.5 悬空else问题
如果有多个 if 和 else,可以记住这样一条规则,else总是跟最近的if匹配。那让我们猜测一下下面代码的运行结果。
很多初学者,以上来判断a是0,不等于1,那就执行else子句,打印haha,但是当你去运行代码,输出的结果啥也不是。
这是为什么呢?
这就是悬空else问题,有如果多个if和else,可以记住这样一条规则,else 总是跟最近的if匹配。
上图的代码实际上else是和第二个if匹配的,后面的if...else语句是嵌套在第一个if语句中的,如果第一个if语句不成立,嵌套 if和else就没机会执行了,最终啥都不打印。如果代码改成如下就好理解了。
只要带上大括号,代码的逻辑就会更加的清晰,所以大家以后再写代码的时候要注意括号的使用,让代码的可读性更高。
2.关系操作符
c语言用于比较的表达式,称为关系表达式,里面使用的运算符就称为关系运算符,主要有下面六个。
- > 大于运算符
- < 小于运算符
- >= 大于等于运算符
- <= 小于等于运算符
- == 相等运算符
- != 不相等运算符
关系表达式通常返回0或1,表示真假。c语言中,0表示假,所有非零值表示真。比如,20>12 返回1,12>20返回0。关系表达式常用于 if 或 while 结构。
注意:相等运算符 == 与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候,可能会不小心写成if( x = 3),这个式子表示对变量x赋值为3,它的返回值为3,所以if判断总是为真。
为了防止出现这种错误,有的程序喜欢将变量写在等号的右边,如 if( 3 == x),这样的话,如果把==误写成 = ,编译器就会报错。
另一个需要笔面的错误是:多个关系运算符不宜连用。
如:i <j <k
上面示列中,连续使用两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的效果,即不是保证变量j的值在j和k之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式.
(i<j)<k
上面式子中,i<j 返回0或1,所以最终是0或1与变量k进行比较。如果想要判断j的值是否在i和k之间,应该使用下面的写法。
i < j && j < k
比如:我们输入一个年龄,如果年龄在18~36之间,我们输出青年。
如果这样写 if(18<=age<=36),当我们输入10的时候,依然输出青年。
如果要判断则要按照如下方式书写
以上是关于操作符我们需要理解的。
3.条件操作符
条件操作符也叫三目操作符,需要接受三个操作数,形式如下:
条件操作符的逻辑是:如果 exp1 为真则 exp2结果代表整个表达式的结果;如果 exp1 为假则exp3 的结果代表整个表达式的结果。
练习1:
改写后:
4.逻辑操作符: && ,|| ,!
逻辑运算符提供逻辑判断功能,用于构建复杂的表达式,主要有下面三个运算符。
- !:逻辑取反运算符。
- &&:与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
- ||: 或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
4.1 逻辑取反运算符 !
0为真,非0表示假,如果a表示真,!a表示为假。
4.2 与运算符 &&
&&就是与运算符,也是并且的意思,&&是一个双目操作符,使用的方式是a&&b,&&两边的表达式都为真的时候,整个表带式才为真,只要有一个是假,整个表达式为假。
比如:我们说月份3到5月是春天,那使用代码怎么体现呢?
4.3 或运算符 ||
|| 就是或运算符,也就是或者的意思,||也是一个双目操作符,使用的方式a || b,||两边的表达式只要有一个为真,整个表达式就是真,两边的表达示都为假时才为假。
比如:我们说一年中月份是12月或者1月或者2月是冬天,那代码该如何实现?
4.4 练习:闰年的判断
4.5短路
c语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值。
如果左边的表达式满足逻辑运算的条件,就不再对右边的表达式求值。这种情况称为短路。
如前面的代码:
表达式中&&的左操作数month >= 3,右操作数是month <= 5,当左操作数month >=3 的结果为0的时候,即使不判断 右操作数整个表达式的结果也是0(不是春季)。
所以,对于&&操作符来说,左边操作数的结果为0的时候,右边操作数不再执行。
对与||操作符是怎样的呢? 我们结合前面的代码:
如果month==12整个表达式都为也是1(即为真是冬季),不用再判断month是否等于1或者2。
所以,|| 操作符的左操作数的结果不为0时,就无需执行右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
5.switch语句
除了if语句外,c语言还提供了Switch语句来实现分支结构。
Switch语句是一种特殊形式的if...else结构,用于判断条件有多个结果的情况。它把多重的else if 改成易用可读的形式。
上面代码中,根据表达式expression不同的值,执行相应case分支。如果找不到对应的值,就执行default分支。
注:
- Switch后的expression必须是整型表达式
- case后的值,必须是整形常量表达式
5.1 if语句与Switch语句的对比
练习:输入一个整数值,计算除3之后的余数
如果使用if语句完成,如下:
如果使用Switch语句改写,就可以这样:
上面的代码,我们需要注意的点有:
- case 和后面的数字必须要有空格
- 每一个case语句中的代码执行完成后,需要加上break,才能跳出这个Switch语句。
5.2 Switch语句中的break
前面的代码中,如果我们去掉break,会怎样呢?
我们发现10除以3余数本来是1但是运行结果多出来一个“余数是2”的打印。
这是为什么呢?
原因是Switch语句也是分支效果的,只有在Switch语句在使用break才能跳出Switch语句,如果case后面没有break语句,代码会继续执行,有可能执行其他case语句中的代码,直到遇到break语句或者Switch语句结束。就比如上面的代码就执行了case2中的语句。
所以,Switch语句中的break语句非常重要,能实现真正的分支效果。
当然,break也不是每个case语句都得有,这就得根据事实看情况。
练习:
- 输入1~5输出“工作日”;
- 输入6~7输出“休息日”
5.3 Switch语句中的default
如果上式代码中的输入的不是1~7的数字,要提示输入错误,那代码就可以用default来完成,如下所示:
5.4 Switch语句中的case和default的顺序问题
在Switch语句中case子句和default子句有要求顺序吗?default只能放在最后吗?其实,在Switch语句中 case 语句和 default 语句没有顺序要求,只要你的顺序满足实际需求即可。不过我们通常把default放在最后。
6. while循环
while语句的语法结构和if语句十分相似,但是又有区别。
6.1 if 和 while 语句的对比
从上面我们可以看出两者的相似之处。6.3
从这里我们可以看出区别,while语句是可以实现循环的。
6.2 while循环的实践
练习:在屏幕上打印1~10的值
6.3 练习
输入一个正的整数,逆序打印这个整数的每一位
列如:
输入:1234, 输出:4 3 2 1
输入:521 ,输出:1 2 5
题目解析
- 想要得到n的最低位,可以使用n%10的运算,得到的余数就是最低位,如:1234%10得到4
- 要想去掉n的最低位,找出倒数第二位,则使用n=n/10操作就可以去掉最低位,如:n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第二位3。
- 循环1和2两个步骤,在n变成0之前,就能到所有的位。
![](https://i-blog.csdnimg.cn/blog_migrate/7d93262a4e26c723e8dbb6a668cc09f6.png)
7. for循环
7.1 语法形式
for循环是三种循环中使用最多的,for 循环的语法形式如下:
1 for(表达式1;表达式2;表达式3);
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
7.2 for循环的实践
练习:在屏幕上打印1~10的值
参考代码:
7.3 while循环和for循环的对比
for 和while 在实现循环的过程中都有初始化、判断、调整这三部分,但是for循环的三部分非常集中而while循环相对分散,因此for循环更便于代码维护,for形式更优一些。
7.5 练习
练习1:
计算1~100之间3的倍数的数字之和
优化后
8. do-while循环
8.1语法形式
在循环语句中 do while语句的使用最少,它的语法如下:
do
语句;
while(表达式);
while 和 for 这两种循环都是先判断,条件满足就进入循环,如果不满足就跳出循环;
而do while 循环则是先进入循环体,执行循环语句,然后在执行while后的判断表达式,表达式为真则会进入下一次,表达式为假,则不在继续循环。
8.2 do while循环的实例
在屏幕上打印1~10的值
一般do while循环至少执行一次,所以使用较少。
8.3 练习
输入一个整正数,计算这个整数是几位数?
例如:
输入:1234 输出:4
输入:12 输出:2
这里并非必须要使用do while语句但是使用do while语句比较合适,因为即使数字是0也算一位。