C语言是结构化的程序设计语言,这里的结构是指顺序结构,选择结构,循环结构,C语言是能够实现这三种结构的。我们可以使用if,switch实现分支结构(顺序和选择),使用for,while,do whle实现循环结构。
1.if语句
1.1if
if语句的语法形式如下:
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。在C语言中,0表示假,非0表示真,也就是表达式的结果如果是0;则语句不执行,表达式的结果如果不是0,则语句执行。
下面我为大家举一个例子:
if语句的执行流程如下:
1.2else
上面的例子中判断一个数是否是奇数,那么一个数不是奇数那就是偶数了,如果任意一个整数,我们要清楚的判断是奇数还是偶数怎么表示呢?
这里就需要用到if....else.....语句了,语法形式如下:
例子:输入一个整数,判断是否为奇数,如果是奇数就打印奇数,否则打印偶数。
练习:输入一个年龄,>=18岁就输出成年,否则输出未成年
1.3分支中包含多条语句
默认在if和else语句中默认都只控制一条语句,比如:
上面的代码,你会发现输入的值不管是不是>=18还是小于18,“可以交女朋友”都会打印在屏幕上。
这是因为 if 语句只能控制⼀条语句,就是 printf("成年了\n"); ,if语句为真,则打印成年了, if语句为假,则不打印,对于 printf("可以谈恋爱了\n"); 是独⽴存在的,不管if语句的条件的真 假,都会被执⾏。那如果我们要if语句同时控制2条语句,怎么办呢?那就要使⽤ {} 将代码括起来, else后也可以跟上⼤括号。如下:
1.4嵌套if
在if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断。
比如:要求输入一个整数,判断输入的整数是0,还是正数或者负数。
在上面的代码中就用到了嵌套if语句。
再比如:
输入一个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数就输出负数。
以上就是if嵌套语句的语法,有了嵌套语句就可以完成更多复杂逻辑的判断。
注:如果有多个if和else,就可以记住这样一条规则,else总是和最近的if匹配。所以建议每次用if...else语句都加一个大括号,就像上面的代码一样。
2.关系操作符
C语言用于比较的表达式,称为关系表达式,里面使用的运算符就称关系运算符,主要有下面6个。
> ⼤于运算符
< ⼩于运算符
>= ⼤于等于运算符
<= ⼩于等于运算符
== 相等运算符
!= 不相等运算符
关系表达式通常返回0或1,表示真假。
C语言中,0表示假,所有非0的值表示真。比如:20>12返回1,12>20返回0.
关系表达式通常用于if或者while结构。
注意:相等运算符==和赋值运算符=是两个不一样的运算符。有时可能会不小写写错它可以运行但很容易出现意料之外的结果。
另⼀个需要避免的错误是:多个关系运算符不宜连⽤。
上⾯⽰例中,连续使⽤两个⼩于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的 表达式。
上⾯式⼦中, i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进⾏⽐较。如果想要判断变量 j 的值是否在 i 和 k 之间,应该使⽤下⾯的写法。
比如:我们输入一个年龄,如果年龄在18到30之间,我们输出青年。
如果我们这样写
当我们输入10的时候,依然输入青年这是因为,我们先拿18和age中存放的10⽐较,表达式18<=10为假,18<=age的结果是0,再拿0和 36⽐较,0<=36为真,所以打印了青年,所以即使当age是10的时候,也能打印青年,逻辑上是有问题的,所以这个代码我们应该这样写:
3.条件操作符
条件操作符也叫三目操作符,需要接收三个操作数的,形式如下:
条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
4.逻辑操作符:&&,||,!
! :逻辑取反运算符(改变单个表达式的真假)
&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)
|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)
4.1逻辑取反运算符
比如:我们有一个变量叫flag,如果flag为假,要做一个什么事情
如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真 所以上⾯的代码的意思就是 flag 为假,执⾏if语句中的代码。
4.2 与运算符
&& 就是与运算符,也是并且的意思, && 是⼀个双⽬操作符,使⽤的⽅式是 a&&b , && 两边的表达 式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。
比如说:如果我们说三月份是3到5月,是春天,那使用代码怎么体现呢?
这里表达的意思就是month既要大于等于3,又要小于等于5,必须同时满足。
4.3或运算符
|| 就是或运算符,也就是或者的意思, || 也是⼀个双⽬操作符,使⽤的⽅式是 a || b , || 两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
⽐如:我们说⼀年中⽉份是12⽉或者1⽉或者2⽉是冬天,那么我们怎么使⽤代码体现呢?
C语言的逻辑运算符还有一个特点,他总是对左侧的表达式求值,再对右侧的表达式求值,这个顺序是保证的。如果左边的表达式满足逻辑运算符的条件,就不在对右边的表达式求值,这种情况称为“短路”。
5.switch语句
除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。
switch 语句是⼀种特殊形式的if...else 结构,⽤于判断条件有多个结果的情况。它把多重 的 else if 改成更易⽤、可读性更好的形式。
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值, 就执⾏ default 分⽀。
注:
switch 后的 expression 必须是整型表达式
case 后的值,必须是整形常量表达式
5.1if语句和switch语句的对比
如:输入任意一个整数,计算除三之后的余数
if语句
switch语句
上述的代码中,我们要注意的点有:
1.case后后边的数字之间必须要有空格
2.每一个case 语句中的代码执行完成后,需加上break,才能跳出switch语句。
5.2switch语句中的break
前⾯的代码中,如果我们去掉case语句中的break,会出现什么情况呢?
我们发现,7除以3本来余数是1,但是我们发现程序运行的结果多了一行“余数是2”的打印。
原因是 switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语 句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,有可能执⾏其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。就⽐如上⾯的代码就执⾏了 case 2 中的语句。
所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。 当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。
5.3switch语句中的default
在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹 配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊ default ⼦句。
switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执⾏ default ⼦句。
例:
我们通常是把 default ⼦句放在最后处理的。
6.while循环
C语言提供了三种循环语句,while就是其中的一种,接下来介绍while语句
⾸先上来就是执⾏判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语 句,语句执⾏完后再继续判断,是否进⾏下⼀次判断。
实践
在屏幕上打印1到10的数:
7.for循环
for循环的语法形式如下:
表达式1用于循环变量的初始化
表达式2用于循环结束条件的判断
表达式3用于循环变量的调整
⾸先执⾏ 表达式1 初始化循环变量,接下来就是执⾏ 表达式2 的判断部分, 表达式2 的结果如果 ==0,则循环结束; 表达式2 的结果如果!=0则执⾏循环语句,循环语句执⾏完后,再去执⾏表 达式 3 ,调整循环变量,然后再去 表达式2 的地⽅执⾏判断, 表达式2 的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循环。
for循环的实践
在屏幕上打印1到10的值:
计算1~100之间3的倍数的数字之和
8.do-while循环
它的语法形式如下:
while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳 出循环;
⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表 达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
在 do while 循环中先执⾏图上的“语句”,执⾏完语句,在去执⾏“判断表达式”,判断表达式的 结果是!=0,则继续循环,执⾏循环语句;判断表达式的结果==0,则循环结束。 所以在 do while 语句中循环体是⾄少执⾏⼀次的,这是 do while 循环⽐较特殊的地⽅。
do-while 的实践
在屏幕上打印1到10的值
9.break和continue语句
在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中 提供了 break 和 continue 两个关键字,就是应用到循环中的。
break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执行。
continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。
9.1while循环中的break和continue
break举例
打印了1,2,3,4后,当i等于5的时候,循环正 break 的地⽅终⽌,不再打印,不再循环。
所以 break 的作⽤就是永久的终⽌循环,只要 break 被执⾏, break 外的第⼀层循环就终⽌了。
continue举例
continue 是继续的意思,在循环中的作⽤就是跳过本次循环中 continue 后边的代码,继续进⾏下⼀次循环的判断。
到这⾥我们就能分析出来, continue 可以帮助我们跳过某⼀次循环 continue 后边的代码,直接 到循环的判断部分,进⾏下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成 死循环。
9.2for循环中的break和continue
for循环的break和while循环一样不管循环还需要循环多少次,只要执⾏到了 break ,循环就彻底终⽌。
continue举例
所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调 整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤ continue 来实现。
do while循环中的break和continue的作用几乎和while循环中一模一样。
10.循环的嵌套
例:
找出100~200之间的素数,并打印在屏幕上。注:素数⼜称质数,只能被1和本⾝整除的数字。
题目解析:
1.要从100~200之间找出素数,⾸先得有100~200之间的数,这⾥可以使⽤循环解决。
2.假设要判断i是否为素数,需要拿2~i-1之间的数字去试除i,需要产⽣2~i-1之间的数字,也可以使⽤ 循环解决。
3.如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。
11.goto语句
C语言提供了一种非常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处
例如:
goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建 议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出 使⽤ goto 就⾮常的⽅便了。
感谢大家的浏览