5.1 逻辑表达式
①包括if语句在内的某些C语句都必须测试表达式的值是“真”还是“假”,诸如i > j这样的比较运算会产生整数:0(假)或1(真);
②C语言的关系运算符和数学上的 < > <= >=运算符相对应,只是在C语言的表达式中时产生的结果是0(假)或1(真)。 eg 表达式10 < 11的值为1, 表达式11 < 10 的值为0;
③关系运算符的优先级低于算术运算符,且都是左结合; eg ( i + j )< ( k - 1) ;
④判等运算符
符号 | 含义 |
== | 等于 |
!= | 不等于 |
左结合, 产生0(假)和1(真), 优先级低于关系运算符。 eg (i < j)== (j < k)
⑤逻辑运算符
符号 | 含义 |
! | 逻辑非 |
&& | 逻辑与 |
|| | 逻辑或 |
逻辑运算符将任何非零值作为真值处理,同时将任何零值操作数作为假值来处理;
⑥如果表达式的值为0,!表达式的结果为1;表达式1和2的值都是非零值,那么表达式1&&表达式2的结果为1;如果表达式1或表达式2的值中任意一个(或两者都)是非零值,表达式1||表达式2的结果为1;其他情况下,结果都是0;
⑦&&和||都会对操作数进行短路运算,首先计算左操作数的值,然后计算右操作数,如果表达式的值可以仅有左操作数推导,则不计算右操作数的值,也不执行右边的表达式;
5.2 if 语句
① 【if 语句】 if(表达式) 语句
②表达式两边的圆括号是必须的,没有then,圆括号后面加分号;则执行空语句。执行if语句时,先计算圆括号内表达式的值,如果表达式的值非0(真值),再执行圆括号后面的语句;
③不要混淆 ==(判等) 和 =(赋值), eg if( i= 0)测试结果总是为真,因为其为赋值;
④if语句判定变量是否落在某个范围 if (a <= i && i <= b);判定变量在范围之外 if (i < a || i > b);
⑤注意,在if语句中,语句是一条语句而不是多条语句;
⑥【复合语句】 {多条语句} 通过在一组语句周围放置花括号,可以强制编译器将其作为一条语句处理;
⑦为了表示清楚,通常将一条复合语句放在多行内,每行有一条语句,每条语句内部仍然以分号结尾,但复合语句不是,花括号外不加分号;
⑧【带有else子句的if语句】 if (表达式) 语句 else 语句 如果if(表达式)内的值为0,那么就执行else语句。
⑨if和else对齐排列在语句起始位置,内部语句常采用缩进格式;
⑩即使在不必要的情况下也可以添加花括号,这样容易添加更多的语句到子句中,避免了增加语句时忘记加 {} 引发的错误;
⑾级联式 if 语句
if (表达式)
语句
else if (表达式)
语句
...
else if (表达式)
语句
else
语句
需要判定一系列的条件,一旦其中某一个条件为真就立刻停止。这种格式中最后两行else语句不是总出现,级联式if语句并不是新的语句类型,只是普通的if语句,碰巧有另外一条if语句作为else子句,而且这条if语句又有另外一条if语句作为他自己的else子句,以此类推;
⑿C语言遵循的规则是else子句应该属于离他最近的还未和其他else匹配的if语句,,为了使else子句属于外层的if语句,可以把内层的if语句用花括号括起来;
⒀【条件表达式】 表达式1 ? 表达式2 : 表达式3 表达式1,表达式2,表达式3可以是让任何类型的表达式,如果表达式1成立,那么表达式2,否则表达式3,表达式2或表达式3计算出来的值就是整个条件表达式的值。
5.3 switch语句
①【switch语句】
switch (表达式) {
case 常量表达式 : 语句; break;
...
case 常量表达式 :语句; break;
default : 语句;
}
②C语言把字符当成整数来处理,因此switch语句能对字符进行判定,但不能用浮点数和字符串;常量表达式中不能包含变量和函数调用,常量表达式的值也必须是整数(字符也可以);每个分支标号后面可以跟任意数量的语句且不需要用花括号,每组语句最后一条通常是break语句;default分支不一定放在最后;多个分支标号可以放置在同一组语句的前面,为节省空间,几个分支标号可放置在同一行中
switch (grade){
case 4: case 3: case 2: case 1:
printf ("Passing");
break;
case 0: printf("Failing");
break;
default:
printf("Illegal grade");
break;
}
③switch语句不要求一定有default分支,如果default不存在,控制表达式的值和任何一个分支标号都不匹配,控制会直接转给switch后面的语句;
④break语句的作用:执行break语句会使程序跳出switch语句,继续执行switch后面的语句。switch语句实际上是一种基于计算的跳转,对控制表达式求值时,控制会跳转到与switch表达式的值相匹配的分支标号处,执行完分支中最后一条语句后,程序控制向下跳转到下一个分支的第一条语句上,忽略下一个分支的分支标号,如果没有break语句(或者其他某种跳转语句),控制将会从一个分支继续到下一个分支;
⑤switch语句中最后一个分支不需要break语句,但通常还会放一个break语句,防止将来增加分支时出现丢失break的问题;
⑥当int 型和float型混在一个表达式中时,表达式类型为float型