if(表达式)
语句1
else
语句2
例⼦:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数。
#include <stdio.h> int main() { int num = 0; scanf("%d", &num); if(num % 2 == 1) printf("%d 是奇数\n", num); else printf("%d 是偶数\n", num); return 0; }
1.3 分支中包含多条语句
默认在if和else语句中默认都只控制⼀条语句
1.4 嵌套if
在if else语句中,else可以与另⼀个if语句连⽤,构成多重判断。
⽐如:
输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:⾮正数。
#include <stdio.h> int main() { int num = 0; scanf("%d", &num); if(num > 0) { if(num%2 == 0) printf("偶数\n"); else printf("奇数\n"); } else { printf("⾮正数\n"); } return 0; }
1.5 悬空else问题
如果有多个if和else,可以记住这样⼀条规则,else总是跟最接近的if匹配。#include <stdio.h> int main() { int a = 0; int b = 2; if(a == 1) if(b == 2) printf("hehe\n"); else printf("haha\n"); return 0; }
但是当你去运⾏代码,输出的结果是:啥都不输出。
这就是悬空else的问题,如果有多个if和else,可以记住这样⼀条规则,else总是跟最接近
的if匹配。
上⾯的代码排版,让else和第⼀个if语句对⻬,让我们以为else是和第⼀个if匹配的,当if
语句不成⽴的时候,⾃然想到的就是执⾏else⼦句,打印haha,但实际上else是和第⼆个if
进⾏匹配的,这样后边的if...else语句是嵌套在第⼀个if语句中的,如果第⼀个if语句就不
成⽴,嵌套if和else就没机会执⾏了,最终啥都不打印。
如果代码改成下⾯这样就更加容易理解了
#include <stdio.h> int main() { int a = 0; int b = 2; if(a == 1) { if(b == 2) printf("hehe\n"); else printf("haha\n"); } return 0; }
只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使 ⽤,让代码的可读性更⾼。
2.0 关系操作符
C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称
为“关系运算符”(relational operator),主要有下⾯6个。
•> ⼤于运算符
•< ⼩于运算符
•>= ⼤于等于运算符
•<= ⼩于等于运算符
•== 相等运算符
•!= 不相等运算符
关系表达式通常返回0或1,表⽰真假。
C 语⾔中,0表⽰假,所有⾮零值表⽰真。⽐如,20 > 12返回1,12 > 20返回0。
注意:相等运算符==与赋值运算符=是两个不⼀样的运算符,不要混淆。有时候,可能会不⼩⼼写
出下⾯的代码,它可以运⾏,但很容易出现意料之外的结果。
为了防⽌出现这种错误,有的程序员喜欢将变量写在等号的右边。
if (3 == x)
这样的话,如果把 ==误写成=,编译器就会报错。
另⼀个需要避免的错误是:多个关系运算符不宜连⽤
3.0 条件操作符(三目操作符)
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果exp1为真,exp2计算,计算的结果是整个表达式的结果;如果
exp1为假,exp3计算,计算的结果是整个表达式的结果。
4.0 逻辑操作符:&& , || , !
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。
•! :逻辑取反运算符(改变单个表达式的真假)。
•&& :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
•|| :逻辑或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
4.1 短路
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
5.0 switch语句
除了if语句外,C语⾔还提供了switch语句来实现分⽀结构。
switch语句是⼀种特殊形式的if...else结构,⽤于判断条件有多个结果的情况。
switch (expression) { case value1: statement case value2: statement ... default: statement }
上⾯代码中,根据表达式expression不同的值,执⾏相应的case分⽀。如果找不到对应的值,
就执⾏default分⽀。
注:
•switch 后的expression必须是整型表达式
•case 后的值,必须是整形常量表达式
•case 和后边的数字之间必须有空格
•每⼀个 case语句中的代码执⾏完成后,需要加上break,才能跳出这个switch语句
5.1 switch语句中的case和default的顺序问题
在switch语句中case语句和default语句是没有顺序要求的,只要你的顺序是满⾜实
际需求的就可以。
不过我们通常是把default⼦句放在最后处理的。
default放前面需要加break,放在最后则不用加
6. while循环
C语⾔提供了3种循环语句, while就是其中⼀种,接下来就介绍⼀下while语句。
while 语句的语法结构和if语句⾮常相似。
它们的区别就是:while语句是可以实现循环效果的。
6.1 while 循环的实践
练习:在屏幕上打印 1~10 的值
#include <stdio.h> int main() { int i = 1; while(i <= 10) { printf("%d ", i); i = i + 1; } return 0; }
⾸先上来就是执⾏判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语
句,语句执⾏完后再继续判断,是否进⾏下⼀次判断。
7.0 for循环
for(表达式1; 表达式2; 表达式3) 语句;//如果循环体想包含更多的语句,可以加上⼤括号
表达式1⽤于循环变量的初始化
表达式2⽤于循环结束条件的判断
表达式3⽤于循环变量的调整
7.1 for循环的实践
练习:在屏幕上打印1~10的值
#include <stdio.h> int main() { int i = 0; for(i = 1; i <= 10; i++) { printf("%d ", i); } return 0; }
7.2 while循环和for循环的对⽐
for和while在实现循环的过程中都有初始化、判断、调整这三个部分,但是for循环的三个部
分⾮常集中,便于代码的维护,⽽如果代码较多的时候while循环的三个部分就⽐较分散,所以从形 式上for 循环要更优⼀些。
8.0do-while 循环
在循环语句中do while语句的使⽤最少(多用于至少要执行一次的时候),它的语法如下:
do 语句; while(表达式);
while和for这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳
出循环;
⽽do while循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏while后的判断表达式,表
达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
8.1 do while循环的实例
在屏幕上打印1~10的值
#include <stdio.h> int main() { int i = 1; do { printf("%d ", i); i = i + 1; }while(i <= 10); return 0; }
9.0 break和continue语句
在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中
提供了break和continue两个关键字,就是应⽤到循环中的。
•break 的作⽤是⽤于永久的终⽌循环,只要break被执⾏,直接就会跳出循环,继续往后执
⾏。
•continue 的作⽤是跳过本次循环中continue后边的代码,在for循环和while循环中有
所差异的。
10.0 循环的嵌套
三种循环 while,do while,for,这三种循环往往会嵌套在⼀起才能更好的解决
问题,就是我们所说的:循环嵌套.
例子:找出100~200之间的素数,并打印在屏幕上。
#include <stdio.h> int main() { int i = 0; //循环产⽣100~200的数字 for(i = 100; i <= 200; i++) { //判断i是否为素数 //循环产⽣2~i-1之间的数字 int j = 0; int flag = 1;//假设i是素数 for(j = 2; j < i; j++) { if(i % j == 0) { flag = 0; break; } } if(flag == 1) printf("%d ", i); } return 0; }
11.goto 语句
C语⾔提供了⼀种⾮常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同⼀个函数
内跳转到设置好的标号处。
例如:
#include <stdio.h> int main() { printf("hehe\n"); goto next; printf("haha\n"); next: printf("跳过了haha的打印\n"); return 0; }
goto语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建 议是能不⽤尽量不去使⽤;但是 goto语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳 出,使⽤ goto就⾮常的⽅便了。
本来for循环想提前退出得使⽤break,⼀个 break 只能跳出⼀层 for 循环,如果3层循环嵌套
就得使⽤3个break才能跳出循环,所以在这种情况下我们使⽤goto语句就会更加的快捷。