C07_选择语句

语句介绍

1. 选择语句

if语句和switch语句允许程序在一组可选项中选择一条特定的去执行

2. 重复语句

while语句,do语句和for语句支持重复(循环)操作

3. 跳转语句

break语句,continue语句和goto语句导致无条件低跳转到程序的某个位置.return也属于此类

4. 逻辑表达式

包括if语句在内的某些C语言都必须测试表达式的值是还是.在C语言中,诸如i<j这样的比较运算会产生整数:0(假)或1(真)

5. 关系运算符
  1. C语言的关系运算符,和数学上的<,>,,相对应,C语言的表达式产生的结果是0(假)和1(真)
  2. 关系运算符的优先级低于算术运算符,并且关系运算符都是左结合的
  3. i < j < k在C语言中是合法的,但是可能不是你预期的结果,因为是左结合的,所以上式等价于(i < j) < k,而i<j的结果是0或者1,所以这明显不是你想要的结果
6. 判等运算符
  1. 和关系运算符一样,判等运算符也是左结合的,也是产生0(假)或1(真)结果.然而
  2. 判等运算符的优先级是低于关系运算符的. i < j == j < k等价于(i < j) == (j < k)
7. 逻辑运算符
  1. !一元运算符,逻辑非,&&二元运算符,逻辑与,||二元运算符,逻辑或
  2. 逻辑运算符产生的结果也是0或1
  3. 如果表达式的值为0,那么!表达式的结果为1,如果表达式1和表达式2的值都是非零值,那么表殴打时1&&表达式2的结果为1,如果表达式1或表达式2的值中任意一个是(或者两个都是)非零值,那么表达式1||表达式2的结果为1
  4. 运算符&&||都对操作数进行短路计算.也就是说,这些运算符计算出左操作数的值,然后计算右操作数;如果表达式的值可以由左操作数直接确定,则右操作数将不再去进行运算.
  5. 例如 (i > 0 && ++j > 0) 在 i <=0 的情况下 ++j > 0 这个表达式将不再进行运算
  6. 运算符!的优先级和一元正负号相同,运算符&&和||的优先级低于关系运算符和判等运算符, 例如表达式 i < j && k == m 等价于(i < j) && (k == m),运算符 !是右结合的,而&&||都是左结合的

if 语句介绍

1. 格式

if (表达式) 语句
表达式两边的括号是必需的,它们是if语句的组成部分,不是表达式的内容.

2. 级联if语句介绍
if(表达式)
语句
else if(表达式)
语句
else if(表达式)
语句
else
语句
3. 悬空else的问题

if嵌套的时候,千万要当心著名的悬空else的问题.

#include <stdio.h>
int main()
{
    int x = 10, y = 0, result;
    if (y != 0)
        if (x != 0)
            result = x / y;
    else
        printf("Error: y is equal to 0");
    return 0;
}

结果:

结果什么也没有打印,按照逻辑上来说,应该会打印那个Error的,这是因为if else语句里,else的子句应该属于离它最近的且还未和其他else匹配的if语句.所以正确的习惯是if语句的语句要用括号括起来,这样就不会产生错误配对的情况.

条件表达式

条件运算符
  1. 表达式1 ? 表达式2:表达式3
  2. 表达式1和表达式2以及表达式3可以是任何类型的表达式,条件表达式又称为三元运算符.
  3. 如果表达式1?返回真,则结果是表达式2,否则是表达式3

switch 语句

1. switch 语句的格式
switch(表达式)
{
	case 常量表达式: 语句
	...
	case 常量表达式: 语句
	default: 语句
}
  1. 控制表达式. switch后面必须跟着由圆括号括起来的整型表达式.C语言把字符当成整数来处理,因此switch语句中可以对字符进行判定.但是不能用浮点数和字符串
  2. 分支标号 每个分支的开头都有一个标号,格式如下: case 常量表达式, 常量表达式很像是普通的表达式,只是不能包含变量和函数调用.5,和5+10都是常量表达式,但是n+10不是,除非n是一个表示常量的宏.
  3. 分支标号中的常量表达式的值必须是整数(字符也可以)
  4. 语句: 每个分支标号后面可以跟任意数量的语句.不需要用花括号把这些语句括起来.每条语句的最后一条通常是break语句
  5. 不允许有重复的分支标号,但是对分支的顺序没有要求,特别是default分支不一定要放置在最后
  6. case后面可以跟随一个常量表达式,但是多个分支标号可以放置在同一组语句的前面:
switch(grade)
{
	case 4:
	case 3:
	case 2:
	case 1:printf("passing");
		   break;
 	case 0:printf("Failing");
 		   break;
 	default:printf("Ellegal grade");
 		    break;
}

switch 语句不要求必须有default分支,如果default不存在,而且控制表达式的值和任何一个分支标号都不匹配的话,控制会直接传给switch语句后面的语句

2. break语句的作用
  1. break语句会导致程序switch语句,继续执行switch后面的语句
  2. 需要break语句是由于switch语句实际上是一种基于计算的跳转.对控制表达式求值的时候,控制会跳转到与switch表达式的值相匹配的分支标号处.分支标号只是一个说明switch内部位置的标记.在执行完分支中的最后一条语句的时候,程序控制向下跳转到下一个分支的第一条语句上,而忽略下一个分支的分支标号.如果没有break语句(或者其他某种跳转语句),控制将会从一个分支继续到下一个分支.
#include <stdio.h>
int main()
{
    int grade = 4;
    switch (grade)
    {
    case 4:
        printf("four");
    case 3:
        printf("three");
    case 2:
        printf("two");
    case 1:
        printf("one");
    case 0:
        printf("zero");
    default:
        printf("Illegal grade");
    }
    return 0;
}

结果:

switch语句如果case走完以后,没有break,则会直接跳转到下个case后面的语句,所以明确的指出来break是很好的编程习惯

编程练习

1. 编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的格式:

Enter a 24-hour time: 21:11
Equivalent 12-hour time: 9:11 PM

解析.转换成12小时的格式,就是去判断下当前的时间和关系.

  1. 如果是0小时,就是显示12:xx AM
  2. 如果是小于12小时,显示格式就是hours:minutes AM
  3. 如果是等于12小时,显示的格式是hours:minutes PM
  4. 如果是大于12小时,显示的格式是 hours-12:minutes PM
#include <stdio.h>
int main()
{
    int hours, minutes;
    printf("Enter a number:");
    scanf("%d:%d", &hours, &minutes);
    printf("Equivalent 12-hour time: ");
    if (hours == 0)
    {
        printf("12:%.2d AM\n", minutes);
    }
    else if (hours < 12)
    {
        printf("%d:%.2d AM\n", hours, minutes);
    }
    else if (hours == 12)
    {
        printf("%d:%.2d PM\n", hours, minutes);
    }
    else
    {
        printf("%d:%.2d PM\n", hours - 12, minutes);
    }
    return 0;
}

结果:

2. 编写一个程序,用户输入4个整数中的最大值和最小值:

#include <stdio.h>
int main()
{
    int a, b, c, d, maxNumber, minNumber;
    printf("Enter four Integers: ");
    scanf("%d %d %d %d", &a, &b, &c, &d);
    if (a > b && a > c && a > d)
    {
        maxNumber = a;
        if (b < c && b < d)
        {
            minNumber = b;
        }
        else
        {
            minNumber = c < d ? c : d;
        }
    }
    else if (b > c && b > d)
    {
        maxNumber = b;
        if (a < c && a < d)
        {
            minNumber = a;
        }
        else
        {
            minNumber = c < d ? c : d;
        }
    }
    else if (c > d)
    {
        maxNumber = c;
        if (a < d && a < b)
        {
            minNumber = a;
        }
        else
        {
            minNumber = b < d ? b : d;
        }
    }
    else
    {
        maxNumber = d;
        if (a < b && a < c)
        {
            minNumber = a;
        }
        else
        {
            minNumber = b < c ? b : c;
        }
    }
    printf("Largest: %d\n", maxNumber);
    printf("Smallest: %d\n", minNumber);
    return 0;
}

结果:

3.利用switch语句编写一个程序,把用数字表示的成绩转换为字母表示的等级

#include <stdio.h>
int main()
{
    int grade, gradeClass;
    char gradeChar;
    printf("Enter numerical grade: ");
    scanf("%d", &grade);
    gradeClass = grade / 10;
    switch (gradeClass)
    {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        gradeChar = 'F';
        break;
    case 6:
        gradeChar = 'D';
        break;
    case 7:
        gradeChar = 'C';
        break;
    case 8:
        gradeChar = 'B';
        break;
    case 9:
    case 10:
        gradeChar = 'A';
        break;
    default:
        gradeChar = 'X';
        break;
    }
    if (gradeChar == 'X')
    {
        printf("%d 成绩输入错误,必须是0-100之间", grade);
    }
    else
    {
        printf("Letter grade: %c", gradeChar);
    }
    return 0;
}

结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值