第5章 选择语句

作者: 橡树人 | 来源:发表于2020-02-24 06:31 被阅读0次

英文原版:P73

C语言虽然有许多运算符,但却有相对较少的语句。

截止目前,我们已见过两个语句:return语句和表达式语句。

根据对语句执行顺序有怎样的影响,剩余的C语句中的大多数可以分成三类:

  • 选择语句
    ifswitch语句允许一个程序从一个候选集中选择一个特殊的执行路径;
  • 迭代语句
    whiledofor语句支持迭代;
  • 跳转语句
    breakcontinuegotoreturn等语句会使程序无条件跳转到程序的某个地方;

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,比如表达式10<11的值是1,表达式11<10的值是0。

可用关系运算符来比较整数和浮点数,比如表达式1<2.5的值是1,表达式5.6<4的值为0。

关系运算符的优先级低于算术优先级,比如i+j<k-1等价于(i+j)<(k-1)

关系运算符是左关联的。

注意:
i<j<k等价于(i<j)<k
i<j \&\& j<k

判等运算符

判等运算符有两个:等于运算符==和不等于运算符!=

判等运算符是左关联的。

判等运算符构成的表达式的值要么是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;
}

相关文章

  • C语言017 第十七课 选择结构语句-1 2019-07-08

    选择结构语句 选择结构语句是有条件地执行语句,顺序结构语句是按照顺序执行语句。选择结构语句不同选择结构语句, 是按...

  • 10月19日C#学习总结

    今天学习了选择语句、循环语句、跳转语句 选择语句:if、else语句和switch语句,switch语句也称为开关...

  • 第5章 选择语句

    英文原版:P73 C语言虽然有许多运算符,但却有相对较少的语句。 截止目前,我们已见过两个语句:return语句和...

  • 第6章 循环

    英文原版:P99 在第5章里,我们介绍了C语言的选择语句:if语句和switch语句。 本章我们介绍C语言的循环语...

  • Golang入门四:流程控制

    条件语句 选择语句 循环语句 跳转语句goto

  • 结构语句

    选择结构语句 选择语句分为if条件语句和switch条件语句 if条件语句 if条件语句分为三种语法格式,每一种格...

  • C:基础(2)

    语句类型:普通语句、符合语句、空语句。 选择语句(Selection Statement):if、switch、三...

  • 流程控制

    程序结构选择结构 顺序结构 循环结构顺序结构 ——>语句一——>语句二——>语句三——>选择结构 If语句的用法...

  • Python结构语句和数学函数

    三种结构:顺序结构,选择结构,循环结构 选择语句 条件语句 注:Python中没有switch语句 循环语句 Py...

  • 2017.10.19C#

    上午老师讲了选择语句,if语句,switch语句 循环语句,for,while,do…while,foreach ...

网友评论

    本文标题:第5章 选择语句

    本文链接:https://www.haomeiwen.com/subject/jrjpqhtx.html