文章目录
预备知识
1.关系操作符
关系操作符主要有如下6个:
大于运算符:>
小于运算符:<
大于等于运算符:>=
小于等于运算符:<=
相等运算符:==
不相等运算符:!=
使用的格式如下(运算符前后留有空格):
a > b
a < b
a >= b
a <= b
a == b
a != b
含有这些运算符的表达式返回值为0或1,用于表示真假。常常用于分支语句与循环结构中的条件判断中,一般返回值为“1”,则执行该分支或循环结构中的语句,否则为“0”时,跳出循环或者执行其他满足条件的分支。
注意:
相等运算符“==”与赋值运算符“=”是不同的运算符:由于不管是if (x = 3)…还是if (x == 3)…编译器都不会报错,因此当程序员想要避免出现以上错误时,可以在写相等关系判断语句时将变量与常量的编写顺序颠倒过来,即if (3 == x)…,这样当程序员想要实现这样的功能而又不小心写成if (3 = x)…时编译器便会报错提醒。
另外,多个关系符不宜连用。例如,对于i < j < k这样的语句,以人类的思维当然可以认为它是i < j且j < k的关系,但计算机并不会这么认为。计算机运算上述关系时,会首先确定i < j的关系及返回值,而后将这个返回值再和k比较,即:Step 1:i < j --> 0或1;Step 2:0或1 < k --> 0或1,。并没有实现我们预期的效果,因此为了实现我们原本想要的比较关系和结果,需要写成i < j && j < k的表达式。
2.条件操作符
条件操作符也叫三目操作符,需要接受三个操作数,灵活使用条件操作符可以很好地实现满足条件下的二选一逻辑,从而降低代码的复杂度,使代码更加简洁明了,格式如下所示:
exp1 ? exp2 : exp3
其逻辑为:如果表达式exp1为真则,计算并得到exp2的返回值;如果exp1为假,则计算并得到exp3的返回值。
3.逻辑操作符
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
逻辑取反运算符(对于单个表达式,真取反为假,假取反为真):!
与运算符(对于操作符两侧的表达式,有假为假,全真为真):&&
或运算符(对于操作符两侧的表达式,有真则真,全假为假):||
使用的格式如下:
!a
!b
a | !a |
---|---|
真 | 假 |
假 | 真 |
a && b
a | b | a && b |
---|---|---|
真 | 真 | 真 |
假 | 真 | 假 |
真 | 假 | 假 |
假 | 假 | 假 |
a || b
a | b | a II b |
---|---|---|
真 | 真 | 真 |
假 | 真 | 真 |
真 | 假 | 真 |
假 | 假 | 假 |
逻辑运算符的“短路”情况:
由于C语言逻辑运算符的特点是,先对左侧的表达式求值,再对右边的表达式求值,因此如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。具体到表达式的情形如下两种情况所示:
对于表达式:a && b && c && d && e && …
假如前面两个操作数的结果为假,那么“假”与上任何操作数都为假,因此整个表达式只需计算前两个操作数的结果,且结果为假。
对于表达式:a || b || c || d || e || …
类似地,假如前面两个操作数的结果为真,那么“真”或上任何操作数都为真,因此整个表达式只需计算前两个操作数的结果,且结果为真。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
一、分支语句
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
1.if语句
if 语句的语法形式如下:
if (表达式)
语句
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。
else语句
对于特定的条件,如果满足的话,我们只用if语句就可以实现其后续需要执行的功能,但如果对于不满足的情况,我们也想执行其不满足情况时需要执行的功能,那么我们就需要引入与if语句搭配使用的else语句,语法形式如下:
if (表达式)
{
语句1
}
else
{
语句2
}
以上if语句和else语句搭配使用的话,适合处理仅有两个分支的场景。而当分支大于两个时,其就需要引入嵌套if语句的语法,从而完成复杂逻辑的判断和对应功能的执行,具体形式如下所示:
if (表达式1)
{
语句1
}
else if (表达式2)
{
语句2
}
else if (表达式3)
{
语句3
}
...
else if (表达式n)
{
语句n
}
else
{
语句(n+1)
}
悬空else问题
如果有多个if 和else,else 总是跟最接近的if 匹配。这一点需要和Python语言的使用方法区分开来,Python通过缩进关系来确定与elif相匹配的if语句,而C语言的规定则是跟最接近的if 匹配,因此不要依照缩进关系匹配C语言中的if和else。为了避免这类容易引起歧义的问题产生,我们可以通过大括号将我们希望匹配的if和else语句下需要执行的语句括起来,使得代码逻辑更加清晰,提高代码的可读性。
2.switch语句
除了if 语句外,C语言还提供了switch 语句来实现分支结构。switch 语句是一种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它把多重的else if 改成更易用、可读性更好的形式:
switch (expression)
{
case value1:
statement;
case value2:
statement;
default:
statement;
}
上面代码中,根据表达式expression 不同的值,执行相应的case 分支。如果找不到对应的值,
就执行 default 分支。
需要注意的是:
①switch 后的expression 必须是整型表达式
②case 后的值,必须是整形常量表达式
③case 和后边的数字之间必须有空格
④每一个case 语句中的代码执行完成后,需要加上break ,才能跳出这个switch语句,从而真正实现想要的分支效果。
⑤在switch 语句中case 语句和default 语句是没有顺序要求的,只要顺序是满足实际需求的就可以。不过我们通常是把default 子句放在最后处理的。
二、循环语句
1.while循环
while 语句的语法结构和if 语句非常相似。如下所示:
while (表达式)
{
语句;
}
while语句的执行流程为:首先执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
2.for循环
for 循环是三种循环中使用最多的, for 循环的语法形式如下:
for (表达式1;表达式2;表达式3)
{
语句;
}
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
for循环的执行流程为:首先执行表达式1初始化循环变量,接下来就是执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0则执行循环语句,循环语句执行完后,再去执行表达式3,调整循环变量,然后再去表达式2的地方执行判断, 表达式2的结果是否为0,决定循环是否继续。整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。
对比while循环和for循环:
for 和while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是for 循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候while 循环的三个部分就比较分散,所以从形式上for 循环要更优一些。但如果不知道循环的次数时,while循环是更优的。
3.do-while循环
在循环语句中do while 语句的使用最少,它的语法如下:
do
{
语句;
}while(表达式)
do-while循环的流程为:在do-while 循环中先执行do中的“语句”,执行完语句,再去执行“判断表达式”,判断表达式的结果是!=0,则继续循环,执行循环语句;判断表达式的结果==0,则循环结束。
对比do-while循环和上述的for和while循环:
while 和for 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;
而 do while 循环则是先直接进入循环体,执行循环语句,然后再执行 while 后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。
因此在do-while语句中循环体是至少执行一次的,这是do-while循环比较特殊的地方。
4.循环嵌套
前面学习了三种循环while,do-while,for,这三种循环往往会嵌套在一起才能更好的解决问题,也就是:循环嵌套
5.循环结构中的break和continue语句
在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环,这是非常常见的现象。C语言中提供了break 和continue 两个关键字,就是应该到循环中的。
- break的作用是用于永久的终止循环,只要break 被执行,直接就会跳出循环,继续往后执行。
- continue的作用是跳过本次循环continue 后边的代码,在for 循环和while 循环中有所差异的。
while循环中的break和continue语句:
break 的作用就是永久的终止循环,只要break被执行, break 外的第一层循环就终止了。那以后我们在循环中,想在某种条件下终止循环,则可以使用 break来完成我们想要的效果。
continue 可以帮助我们跳过某一次循环continue 后边的代码,直接到循环的判断部分,进行下一次循环的判断,如果循环的调整是在continue 后边的话,可能会造成死循环。
for循环中的break和continue语句:
其实和while循环中的break 一样, for循环中的break也是用于终止循环的,不管循环还需要循环多少次,只要执行到了break,循环就彻底终止,break的作用是永久的终止循环,未来我们在某个条件发生的时候,不想再继续循环的时候,就可以使用 break来完成。
for循环中continue的作用是跳过本次循环中continue 后的代码,直接去到循环的调整部分。未来当某个条件发生的时候,本次循环无需再执行后续某些操作的时候,就可以使用continue来实现。
do-while循环中的break和continue语句:
do-while语句中的break和continue的作用和while循环中几乎一模一样,这里不再赘述。
6.循环结构中的go to语句
goto语句可以实现在同一个函数内跳转到设置好的标号处。形式为:
语句1;
goto tab:
语句2;
...
tab:
语句n;//跳过了语句2及其后续语句的执行转而执行语句n及其后续的语句
语句(n+1);
需要注意的是:
goto语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用;但是goto语句也不是一无是处,在多层循环的代码中,如果想快速跳出使用goto就非常的方便了。
总结
以上就是本篇文章要讲的关于分支语句与循环语句的内容,本文仅仅简单介绍了语句的结构和注意事项,适合有一定基础的编程人员复习和回顾,分支和循环是我们编程的基础,是我们处理复杂逻辑的重要工具,希望我们共同努力,让代码兴国。