C语言 第四章 关系、逻辑运算与分支流程控制

一、算术运算

+,-,*,/,%,++,--

C语言的算术运算符共有7个,对应9种运算。按运算对象来分,有两个运算对象成为双目运算符;只有一个运算对象,称为单目运算符。

双目运算符有:+(加) -(减) *(乘) /(除) %(求余数,运算对象必须为整型),共对应5种运算。如:a+b;a-b;a*b;a/b;等都有a和b两个运算对象。

单目运算符有:++(自增1,运算对象必须为变量) --(自减1,运算对象必须为变量) +(取正) -(取负),共对应4种运算。如:a++;a--;等只有a一个运算对象。

如何理解++,--前缀形式和后缀形式的运算符?

++,--在变量左边叫前缀形式,表示先使变量的值加1或减1,然后再使用变量的值;++,--在变量右边叫后缀形式,表示先使用变量的值,然后再使变量的值加1减1。

例如:

设int x=5;

y=++x;   表示先计算x=x+1,再计算y=x,结果y=6,x=6。

y=x++;   表示先计算y=x,再计算x=x+1,结果y=5,x=6。

二、赋值运算

=,+=,-=,*=,/=,%d

2.1 基本赋值运算符

一般形式:

变量=表达式;

功能:

将赋值运算符右边表达式的值赋给其左边的变量。

例如:

x=2+b意思是将2+b的运算结果赋给变量x。

总结几个要点:

赋值号(=)左边只能是变量,绝对不能是常数或表达式。这是因为常数和表达式是没有存储单元的。

2.2、复合赋值运算

为了简化程序并提高编译效率,C语言允许在赋值运算符“=”之前加上其他运算符,这样就构成了复合赋值运算符。

一般形式:

变量 算术运算符=表达式;

功能:

对赋值运算符左、右两边的运算对象进行指定的算术运算符运算,再将运算结果赋予左边的变量。

例如:

a+=b;等价于a=a+b;

a-=b;等价于a=a-b;

a*=b;等价于a=a*b;

a/=b;等价于a=a/b;

a%=b;等价于a=a%b;

总结几个要点:

复合赋值运算符右边的表达式是一个运算“整体”,不能把它们分开。如:a*=b+1;等价于a=a*(b+1);如果把:a*=b+1;理解为a=a*b+1;那就错了。

2.3、赋值表达式

用赋值运算符将运算对象连接而成的式子称为赋值表达式。例如:k=(j=1);由于赋值运算符的结合性是从右向左的,因此该赋值表达式等价于k=j=1。

下面是赋值表达式的例子:

【例3.1】赋值表达式,如图代码所示。

 

 三、类型转换

3.1、自动转换

自动转换也叫隐式转换,分两种形式:

1、等于号右边的小类型在赋予左边时会自动转换为左边的大类型(类型的大小指的是在内存中分配的空间大小)

这种情况下,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比较长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。

2、一个由不同类型组成的混合表达式,计算后其结果的类型是构成该表达式中最大的类型。由编译系统自动完成。自动转换遵循以下规则,又如图3-5结构所示:

①、若参与运算量的类型不同,则先转换成同一类型,然后进行运算。

②、转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。

③、所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。

④、char型和short型参与运算时,必须先转换成int型。

 

 

 

 

3.2、强制转换

强制类型转换是通过类型转换运算来实现的,又叫显式转换。

其一般形式为:

(类型说明符)(表达式)

其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。例如:(float)a把a转换为实型(int)(x+y)把x+y的结果转换为整型在使用强制转换时应注意以下问题:

1、类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。

2、无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。

 

四、关系运算

若干表达式用关系运算符连接而成,就构成关系表达式。
关系表达式中,表达式成立,其值为1(真);表达式不成立,其值为0(假)。
其他表达式中,其结果如果是非0则为真,结果为0则为假。
关系运算符的优先级低于算术运算符,高于赋值运算符。

关系运算符号:> >= < <= !=

#include "stdio.h"
void main()
{
    //1、关系运算常用于比较
    //2、关系运算只有两种结果,1真,0假
    int a=1,b=2,c=3;
    printf("\n %d",a==b);
    printf("\n %d",a>=b);
    printf("\n %d",a!=b);
    printf("\n %d",1<=2);
    printf("\n %d",c<2);
    printf("\n %d",a+b>c);
}

运算结果:

 

 

五、逻辑运算

!(逻辑非)
运算规则:!1 = 0,!0 = 1 。优先级:高。
&&(逻辑与)
运算规则:1&&1=1,1&&0=0,0&&1=0,0&&0=0优先级:中
||(逻辑或)
运算规则:0||1=1,1||0=1,0||0=0,1||1=1。
优先级:低

注意:短路,当与运算时,第一个表达式为假时,不会再处理第2个表达式。

a&&b

当或运算时,第1个表达式为真是,不会再处理第2个表达式

a||b

注意:

另外使用时必须注意以下几点:
代数中的不等式0<x<5必须写成(x>0)&&(x<5)
C语言允许直接对数字或字符进行逻辑运算。
例如:!5,其结果为0。因为在C语言中,非0的值均认为是“真”,而5是个非零值,对非零值求反,即得零值。5&&‘c’,结果为1。因为字符'c'的ASCLL码为非零的整数,非零值与非零值作“与”运算,结果为真。

六、运算优先级

 

七、if语句

7.0、代码块

代码块表示一段代码,有{}符号界定,是一个新的作用域,可以有0-n行代码。

#include "stdio.h"
void main()
{
    //代码块1
    {
        int a=1;
        printf("\n %d",a);
    }
    
    //代码块2
    {
        int a=2;
        printf("\n %d",a);
    }
    
}

7.1、单if语句

#include "stdio.h"
void main()
{
    int a=1,b=2,c=3;
    if(a<=b&&c++<=c)
    {
        printf("\n yes %d",c);
    }
    printf("\n no %d",c);
}

 

if(条件表达式)
{
条件表达式为真时要执行的语句块(分支一语句);
}
其语义是:
如果表达式的值为真,则执行其后的分支一语句, 否则不执行该分支一语句。

 

void main()
{
    //输入两个数,求最大数
    int a,b,max;
    printf("请输入a,b的值,空格分开:");
    scanf("%d%d",&a,&b);
    max=a;  //假定a为最大值
    if(b>max)  //如果b比max大
    {
        max=b;  //最大值是b
    }
    printf("最大数是:%d",max);
}

7.2、if else

if(条件表达式)
{
条件表达式为真时要执行的语句块(分支一语句);
}
else
{
条件表达式为假时要执行的语句块(分支二语句);
}
其语义是:如果表达式的值为真,则执行分支一语句,否则执行分支二语句。

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
    int a,b,c,max;
    scanf("%d",&a);
    scanf("%d",&b);
    scanf("%d",&c);
    //如果条件成立
    if(a>b)
    {
        max=a;
    }
    else  //如果条件不成立
    {
        max=b;
    }
    
    if(c>max){  //有代码块的地方,总是会执行一句
        max=c;
    }
        
    printf("最大值是:%d",max);
}

 

#include "stdio.h"
#include "math.h"
void main()
{
    int a,b,max;
    printf("请输入a,b的值,空格分开:");
    scanf("%d%d",&a,&b);
    if(a>b){
        max=a;
    }
    else{
        max=b;
    }
    printf("最大值:%d",max);
}

7.3、多重if

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
    int a;
    scanf("%d",&a);
    
    if(a<0)
    {
        printf("负数");
    }
    else if(a==0)
    {
        printf("");
    }
    else if(a>=100)
    {
         printf("大于100的正数");
    }
    else
    {
        if(a>=1 && a<=50)
        {
            printf("1-50");
        }
        else
        {
            printf("51-99");
        }
    }
    
    printf("\n程序完成");
    
}

使用多重if完成下面的内容:
输入分数,根据分数输出等级.
0-59 不及格
59-70 良好
71-85 优秀
86-100 卓越

问答:

#include "stdio.h"
void main()
{
    int a=5;
    if(a<5){
        printf("a小于5\n");a+=2;
    }
    else if(a==5){
        printf("a等于5\n");a+=2;
    }
    else{
        printf("a大于5\n");a+=2;
    }
    printf("a=%d\n",a);
}

问输出结果?

7.4、?号:号表达式

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
    int a,b,c;
    scanf("%d",&a);
    scanf("%d",&b);
    
    //a>10?printf("大于10"):printf("小于等于10");
    c=(a>b)?(a++):(++b);
    
    printf("%d",c);
}

八、switch语句

一般形式为:

switch(表达式)

{

case 值1:当表达式的值全等于值1时要执行的语句块;break;

case 值2:当表达式的值全等于值2时要执行的语句块;break;

…

case 值n:当表达式的值全等于值n时要执行的语句块;break;

default:当表达式的值与所有case后面的值都不全等时要执行的语句块;break;

}

其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。 如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
    int a;
    scanf("%d",&a);
    
    switch(a)
    {
        case 1:
            printf("a");
            break;
        case 2:
            printf("b");
            break;
        case 3:
            printf("c");
            break;
        default:
            printf("错误:");
            if(a>3)
            {
               printf("数字太大。");
            }
            else
            {
               printf("数字太小");
            }
    }
    
}

 在使用switch语句时还应注意以下几点:

1、表达式只允许是char或int型;

2、在case后的各值只允许是char或int型的常量值,不允许是运算表达式;

3、在case后的各值不能相同,否则会出现错误;

4、在case后,允许有多条语句,可以不用{}括起来;

5、各case和default子句的先后顺序可以变动,而不会影响程序执行结果;

6、每个语句块后的break都可根据需求而省略不写。

7、default整句也可根据需求而省略不用。

练习:

使用switch完成菜单功能,用户按键(1-5)选择。
1、开始游戏
2、创建存档
3、加载存档
4、加载地图
5、退出
请选择(1-5):

当输入1-5以外的内容时输出错误

 

switch练习2:

输入年份与月份,输出天数。

年:2008

月:2

29

 

年:2009

月:3

31

 

 

 

答案:

#include "stdio.h"
void main()
{
    float mark;

    printf("请输入分数:");
    scanf("%f",&mark);

    if(mark<60)
    {
        printf("不及格");
    }
    else if(mark>=60 && mark<=70)
    {
        printf("良好");
    }
    else if(mark>=71 && mark<=85)
    {
        printf("优秀");
    }
    else
    {
        printf("卓越");
    }

}

 

#include "stdio.h"
void main()
{
    int menu;
    printf("\n**********************************");
    printf("\n1、开始游戏");
    printf("\n2、创建存档");
    printf("\n3、加载存档");
    printf("\n4、加载地图");
    printf("\n5、退出");
    printf("\n**********************************");
    printf("\n请选择(1-5):");
    scanf("%d",&menu);
    
    switch(menu)
    {
        case 1:
            printf("\n开始游戏了");
            break;
        case 2:
            printf("\n创建存档了");
            break;
        case 3:
            printf("\n加载存档了");
            break;
        case 4:
            printf("\n加载地图了");
            break;
        case 5:
            printf("\n您确定要退出吗?");
            break;
        default:
            printf("\a输入错误,请重新输入。");
    }
}

 

posted @ 2016-10-21 10:47  张果  阅读(1689)  评论(0编辑  收藏  举报
AmazingCounters.com