英文原版:P73
C语言虽然有许多运算符,但却有相对较少的语句。
截止目前,我们已见过两个语句:return
语句和表达式语句。
根据对语句执行顺序有怎样的影响,剩余的C语句中的大多数可以分成三类:
- 选择语句
if
和switch
语句允许一个程序从一个候选集中选择一个特殊的执行路径; - 迭代语句
while
、do
、for
语句支持迭代; - 跳转语句
break
、continue
、goto
、return
等语句会使程序无条件跳转到程序的某个地方;
C语言中的其他语句只有复合语句和null
语句了。
复合语句将若干个语句分组到一个语句。
null
语句不执行任何操作。
本章介绍选择语句和复合语句。在写if
语句之前,需要逻辑表达式:if
语句要检测的条件。
- 5.1节解释如何从关系运算符(
<
、<=
、>
、>=
)、判等运算符(==
、!=
)、逻辑运算符(&&
、||
、!
)出发构建逻辑表达式。 - 5.2节介绍
if
语句、复合语句及条件运算符(?:
),其中条件运算符可在一个表达式内部对条件进行测试。 - 5.3节描述
switch
语句。
5.1 逻辑表达式
包括if语句在内的一些C语句必须对表达式的值进行测试,来确认该值是true还是false。
比如,if语句可能需要测试表达式i<j
的真假:真值表示i小于j。
在许多编程语言中,像i<j这样的表达式都有一个特殊的Boolean或者logical类型值,这种类型只有两个值:真和假。
但是在C语言中,像i<j这样的比较会产生一个整数值:0或者1。牢记这个规则,下面将介绍用来构建逻辑表达式的运算符。
关系运算符
关系运算符有小于号<
、大于号>
、小于等于号<=
、大于等于号>=
。
关系运算符构成的表达式的值要么是0,要么是1,比如表达式的值是1,表达式
的值是0。
可用关系运算符来比较整数和浮点数,比如表达式的值是1,表达式
的值为0。
关系运算符的优先级低于算术优先级,比如等价于
。
关系运算符是左关联的。
注意:
等价于
。
判等运算符
判等运算符有两个:等于运算符==
和不等于运算符!=
。
判等运算符是左关联的。
判等运算符构成的表达式的值要么是0,要么是1。
例1 判等运算符的优先级
i < j == j < k等价于(i<j) == (j<k)
逻辑运算符
逻辑运算符有3个:逻辑反!
、逻辑且&&
、逻辑或||
逻辑运算符产生的值要么是0,要么是1。
逻辑运算符将任一个非0操作数当做真值,任一个0值当做假值。
逻辑运算符遵循如下规则:
- 如果表达式e的值为0,则
!e
的值为1; - 如果表达式e1和表达式e2的值都是非0值,则
e1 && e2
的值为1; - 如果表达式e1和表达式e2中至少有1个的值是非0,则
e1 || e2
的值为1; - 所有其他情形,逻辑运算符的值都是0;
逻辑且&&
和逻辑或||
都是短路求值的:先求左边操作数的值,后求右边操作数的值。如果能从左边操作数的值推导出整个表达式的值,则就不会对右边操作数求值了。
优先级关系
- 逻辑反
!
的优先级跟单目加减运算符的相同。 - 逻辑且
&&
和逻辑或||
的优先级低于关系运算符。
结合性
- 逻辑反
!
是右结合。 - 逻辑且
&&
和逻辑或||
是左结合。
例1 短路求值
(i!= 0) && (j/i > 0)
idom汇总
if语句
idom1
if (0 < i && i< n)...
idom2
if (i < 0 && i >= n)
复合语句
if
语句
作用:if语句允许一个程序通过测试一个表达式的值来在两个候选项之间选择。
形式1
if (表达式) 语句
解释:
当执行if语句时,会对括号内的表达式求值。如果该表达式的值是非0,则会执行括号后的语句。
注意:
- 这里的环绕表达式的括号都是强制的,是if语句的一部分;
- 在括号之后并没有词
then
;
例1 if语句
if (line_num == MAX_LINE)
line_num = 0;
形式2 : else子句
if (表达式) 语句 else 语句
解释:
如果表达式的值为0,则执行else后紧跟的语句。
例2 找出i和j中的最大值
if (i > j)
max = i;
else
max = j;
例3 找出i、j、k三个数的最大值
if (i > j) {
if (i > k) {
max = i;
}else {
max = k;
}
}else {
if (j > k) {
max = j;
}else {
max = k;
}
}
形式3 级联if语句
需求:需要测试一系列的条件,只要遇到一个条件为真,就停止测试。
形式:
if (表达式)
语句
else if (表达式)
语句
...
else if (表达式)
语句
else
语句
例1 推导级联if语句
最初:
if (n > 0)
printf("n is less than 0\n");
else
if (n == 0)
printf("n is equal to 0\n");
else
printf("n is greater than 0\n");
导出级联if语句
if (n > 0)
printf("n is less than 0\n");
else if (n == 0)
printf("n is equal to 0\n");
else
printf("n is greater than 0\n");
程序示例:计算一个经纪人的佣金
源代码broker.c
#include <stdio.h>
int main(void)
{
float commission, value;
printf("Enter value of trade: ");
scanf("%f", &value);
if (value < 2500.00f) {
commission = 30.00f + .017f * value;
}else if (value < 6250.00f) {
commission = 56.00f + .0066f * value;
}else if (value < 20000.00f) {
commission = 76.00f + .0034f * value;
}else if (value < 50000.00f) {
commission = 100.00f + .0022f * value;
}else if (value < 500000.00f) {
commission = 155.00f + .0011f * value;
}else {
commission = 255.00f + .0009f * value;;
}
if (commission < 39.00f) {
commission = 39.00f;
}
printf("Commission:$%.2f\n", commission);
return 0;
}
else使用问题
规则:一个else字句属于最近的还没有跟else成对的if语句。
例1
if (y != 0)
if (x != 0)
result = x/y;
else
printf("Error:y is equal to 0\n");
应用规则可知:上述代码等价于
if (y != 0)
if (x != 0)
result = x/y;
else
printf("Error:y is equal to 0\n");
条件表达式
条件运算符?
:根据条件的值,表达式产生两个值之一。
形式
表达式1 ? 表达式2 : 表达式3
解释:
- 先求表达式1的值;
- 如果表达式1的值非0,则求表达式2的值,该值就是整个条件表达式的值;
- 否则,求表达式3的值,该值就是整个条件表达式的值;
条件运算符是C语言的所有操作符中唯一的一个三目操作符。
例1 条件运算符?
int i, j, k;
i = 1;
j = 2;
k = i>j ? i : j;//k是2
k = (i >= 0 ? i : 0) + j;//k是3
注意:一般不建议使用条件表达式。
例2 在return语句中使用条件表达式
if (i > j){
return i;
}else {
return j;
}
等价于
return i > j ? i : j;
例3 调用printf函数
if (i > j){
printf("%d\n", i);
}else {
printf("%d\n", j);
}
等价于
printf("%d\n", i > j ? i : j);
5.3 switch
语句
当有许多情况需要考虑时,最好使用switch
语句,而不是级联if
语句,理由:此时,switch
执行速度比if
语句块。
形式:
switch (控制表达式) {
case 常数表达式 : 语句
...
case 常数表达式 : 语句
default : 语句
}
注释:
- 控制表达式
可以是字符和整数表达式,不能是浮点数和字符串; -
case
标签 - 常数表达式
不能包含变量和函数调用; - 语句
在每个case
分组的最后一个语句通常都是break;
- 不允许重复的
case
标签
程序示例:将日期以指定格式打印
源文件date.c
#include <stdio.h>
int main(void)
{
int month, day, year;
printf("Enter date (mm/dd/yy): ");
scanf("%d /%d /%d", &month, &day, &year);
printf("Dated this %d", day);
switch(day){
case 1:
case 21:
case 31:
printf("st");
break;
case 2:
case 22:
printf("nd");
break;
case 3:
case 23:
printf("rd");
break;
default :
printf("th");
break;
}
printf(" day of ");
switch(month){
case 1:
printf("January");
break;
case 2:
printf("February");
break;
case 3:
printf("March");
break;
case 4:
printf("April");
break;
case 5:
printf("May");
break;
case 6:
printf("June");
break;
case 7:
printf("July");
break;
case 8:
printf("August");
break;
case 9:
printf("September");
break;
case 10:
printf("October");
break;
case 11:
printf("November");
break;
case 12:
printf("December");
break;
}
printf(", 20%.2d.\n", year);
return 0;
}
网友评论