5.1 逻辑表达式
C语言中没有布尔类型,一般在进行逻辑运算和关系运算(比如比较两个数的大小i
0 表示假值,1表示真值.
逻辑运算符&&和||都对操作数进行"短路"计算.也就是说,如果这些运算符首先计算出左侧操作数的值,然后是右侧操作数;如果表达式的值可以由左侧操作数的值单独推导出来,那么将不计算右侧操作数的值.比如如下表达式:
(i != 0 )||(j / i > 0 )
会先计算表达式(i!=0)的值为真,则表达式为真,不在计算(j/i>0)的值了.
这样表达式可能会产生副作用.比如
(i > 0)&&(++j > 0) 假如i>0为假,则j不会做自加运算,这样下次引用时可能会出现错误.
5.2 if语句
1
2 带有else子句 应该注意缩进
else悬空问题
当嵌套使用if语句时,要注意悬空else的问题,比如下面的例子:
if(y != 0)
if(x != 0)
result = x /y;
else
printf("Error: y is equal to 0\n");
|
C语言的规则是else子句属于离它最近的且还未和其他else匹配的if语句. 正确的使用else的方法是对符合语句加上大括号.
if的级联
编程时常常要判定一系列的条件,一旦其中一个条件为真就立刻停止.级联式的if语句是这种情况下最好的语句.
if (表达式)
语句
else if (表达式)
语句
else if (表达式)
语句
......
else if (表达式)
语句
else
语句
5.3 条件表达式
条件表达式的求值步骤是:首先计算表达式1的值,如果表达式1不为0(即为真)则计算表达式2的值,该值即为整个表达式的值,如果表达式1的值为0(假)那么计算表达式3的值,且该值为整个表达式的值.
5.4 布尔值
因为很多程序需要变量能存储假值或真值,所以C语言缺少适当的布尔类型可能会很麻烦.一直采用模拟布尔型变量的方法来解决这个问题.这种模拟的方法是先声明int型变量,而后将其赋值为0或1.
为了使程序便于理解,一个好的方法就是用类似TRUE和FALSE这样的名字定义宏.
#define TRUE 0
#define FALSE 1
|
5.5 switch语句
switch (表达式)
{ case 常量表达式 : 多条语句
......
case 常量表达式 : 多条语句
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内部位置的标记.在执行完情况中的最后一套语句后,程序控制"向下跳转"到下一种情况的第一条语句上,而忽略下一种情况的情况标号.如果没有break(或其他一些跳转语句),程序控制将会从一种情况继续到下一种情况.
Q&A
如果i是int型变量,而f是float型变量,那么条件表达式(i>0?i:f)是哪一种类型的值?
答:当int型和float型的值混合在一个条件表达式中时,表达式的类型为float型.如果i>0为真,那么变量i转化为float型后的值就是表达式的值.
阅读(538) | 评论(0) | 转发(0) |