C语言学习——选择结构程序设计

目录

五、选择结构程序设计

5.1关系运算符和关系表达式

关系运算符机器优先次序

5.2逻辑运算符和逻辑表达式

逻辑表达式

5.3if语句

if语句的3种形式:

条件运算符

5.4switch语句


五、选择结构程序设计

在C语言中,选择结构是用if语句实现的。if语句最常用的形式如下:

if(关系表达式) 语句1 else 语句2

例如:

if(x>0) 
    y=1; 
else 
    y=-1;

其中 x>0 是一个关系表达式;">" 是一个关系运算符。

5.1关系运算符和关系表达式

关系运算是逻辑运算中比较简单的一种。所谓“关系运算”实际上是“比较运算”。将两个值进行比较,判断其比较的结果是否符合给定的条件。符合即为“真”,不符合即为“假”。

关系运算符机器优先次序

C语言提供6种关系运算符:

  • < 、<= 、> 、>= 优先级相同(高)

  • == 、 != 优先级相同(低)

关于优先次序:

赋值运算符 < 关系运算符 < 算术运算符

5.2逻辑运算符和逻辑表达式

用逻辑运算符将关系表达式逻辑量连接起来的式子就是逻辑表达式。在BASIC和Pascal语言中有以下形式的逻辑表达式(AND是逻辑运算符):

(a>b) AND (x>y)

如果(a>b) 且 (x>y) ,则上述逻辑表达式的值为"真"。

逻辑运算符及其优先次序:

C语言提供3种逻辑运算符:

  • && 逻辑与 (相当于其他语言中的AND)

  • || 逻辑或 (相当于其他语言中的OR)

  • 逻辑非 (相当于其他语言中的NOT)

运算举例:

a&&b  // 若a、b为真,则a&&b为真
a||b   //若a、b其中一个为真,则a||b为真
!a  //若a为真,则!a为假

运算符的优先性:

赋值运算符 < &&和|| < 关系运算符 < 算术运算符 < !(非)

逻辑表达式

逻辑表达式的值应该是一个逻辑量“真”或“假”。C语言编译系统在表示逻辑运算结果时,以数值1代表“真”,以数值0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。即一个非零的数值默认为“真”

逻辑运算的真值表

ab!a!ba&&ba||b
非0非00011
非000101
0非01001
001100

小例子:

要判断用year表示的某一年是否为闰年。

闰年条件:能被4整除,但不能被100整除或者能被400整除.

可以用一个逻辑表达式来表示:

(year % 4 == 0 && year % 100 != 0) || year % 400 == 0   //表达式的值为1时,为闰年,否则为非闰年

可以加!来判别非闰年

!((year % 4 == 0 && year % 100 != 0) || year % 400 == 0 )   //表达式的值为1时,为非闰年,否则为闰年

5.3if语句

if语句是用来判定所给的条件是否满足,根据判定的结果(真或假)来决定执行给出的两种操作之一。

if语句的3种形式:
//eg1:
if(x>y) printf("%d",x);
​
//eg2:
if(x>y) 
    printf("%d",x);
else
    printf("%d",y);
​
//eg3:
if(num>500) cost=0.15;
else if (num>300) cost=0.10;
else if (num>100) cost=0.075;
else if (num>50) cost=0.05;
else cost=0;

输入两个实数,按代数值由小到大的顺序输出者两个数。

#include<stdio.h>
int main()
{
    float a,b,t;
    scanf("%f%f",&a,&b);
    if(a>b)
    {
        t=a;
        a=b;
        b=t;
    }
    printf("%.2f,%.2f\n",a,b);
    return 0;
 } 

输入3个数a、b、c,要求从小到大的顺序输出。

#include<stdio.h>
​
int main()
{
    float a,b,c,t;
    scanf("%f%f%f",&a,&b,&c);
    if(a>b)
    {
        t=a;   //实现a和b的互换 
        a=b;
        b=t;
    }
    if(a>c)   //实现a和c的互换
    {
        t=a;
        a=c;
        c=t;
     } 
    if(b>c)   //实现b和c的互换
    {
        t=b;
        b=c;
        c=t;
     } 
    printf("%.2f,%.2f,%.2f\n",a,b,c);
    return 0;
 } 
条件运算符

条件运算符要求有3个操作对象,称三目(元)运算符,它是C语言中唯一的一个三目运算符。条件表达式的一般形式为:

表达式1 ? 表达式2 :表达式3

max = (a>b)?a:b;   
//它是这个执行的:
//如果a条件为真,则条件表达式取值a,否则取值b

又因为条件运算符的优先级别比关系运算符和算术运算符都低。因此可以写成

max = a>b?a:b;   
//如果有这样的
a>b?a:b+1;  //相当于  a>b?a:(b+1);

条件运算符的结合方向为“自右向左”。如果有以下条件的表达式:

a>b?a:c>d?c:d  //相当于 a>b?(c>d?c:d)

条件表达式还可以写成以下表达形式:

a>b?(a==100):(b==100);
//或
a>b? printf("%d",a):printf("%d",b);

即“表达式2”和“表达式3”不仅可以是数值表达式,还可以是赋值表达式或者函数表达式。

例子:输入一个字符,判断它是否大写字母,如果是,将它转换成小写字母,如果不是,不转换。然后输出最后得到的字符。

#include<stdio.h>
​
int main()
{
    char ch;
    scanf("%c",&ch);
    ch = (ch>='A'&&ch<='Z')?(ch+32):ch;
    printf("%c\n",ch);
    return 0;
 } 

5.4switch语句

switch语句是多分支选择语句。

switch(表达式):
{
    case 常量表达式1:  语句1;
    case 常量表达式2:  语句2;
    ... ...
    case 常量表达式n:  语句n;
    default: 语句n+1;
}

说明:

  • switch后面括号内的表达式,其值可以是整型 ,字符型,枚举型等数据;

  • 当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所以的case中的常量表达式的值都没有与表达式的值匹配的时候,就执行default后面的语句。

  • 每一个case的常量表达式的值必须互不相同;否则就会出现互相矛盾的现象。

  • 执行完一个case后面的语句后,流程控制转移到下一个case继续执行。“case常量表达式“只是起语句标号作用,并不是在该出进行条件判断。在只想switch语句时,根据switch后面表达式的值找到匹配的入口标号,就会从此标号执行下去,不再进行判断。

    例子:

    switch(grade)
    {
        case 'A':printf("85~100\n");
        case 'B':printf("70~85\n");
        case 'C':printf("60~69\n");
        case 'D':printf("<60\n");
        default: printf("error\n");
    }
    //假设 grade='A';
    //会连续输出:
    85~100
    70~85
    60~69
    <60
    error

    因此,应该在执行一个case分支后,使流程跳出switch结构,终止switch语句的执行。

    可以用一个break语句来达到此目的。将上面的switch结构改写为:

    switch(grade)
    {
        case 'A':printf("85~100\n");break;
        case 'B':printf("70~85\n");break;
        case 'C':printf("60~69\n");break;
        case 'D':printf("<60\n");break;
        default: printf("error\n");
    }
    //假设 grade='A';
    //出:
    85~100

    声明:本文章为个人学习笔记,资料整理参考谭浩强《C程序设计(第三版)》如有错误,欢迎大家指正!

  • 25
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值