3 运算符与表达式
本章要点
    了解运算符及其表达式的概念,熟练掌握各种运算符的运算规则。重点掌握各种运算符的优先级和结合性。本章的难点在于自增自减运算符的正确运用。
第一节 算术运算符与算术表达式
C语言中基本的算术运算符有:
(1)+:加法运算符,用于计算任意两个数的和。如:3+2,结果为5;
(2)-:减法运算符,用于计算任意两个数的差。如:3.5-2,结果为1.500000;
(3)*:乘法运算符,用于计算任意两个数的乘积。如:4*3,结果为12;
(4)/:除法运算符,用于计算任意两个数的商。如:3.6/3,结果为1.200000;
(5)%:模运算符(求余运算符),用于求余数。如:13%4,结果为1。
这几个运算符要求运算符两边都有数据,即运算对象为两个,所以称为双目算术运算符。
关于算术运算符的几点说明:
(1)用算术运算符和括号将运算对象连接起来的、符合C语言语法规则的式子称为算术表达式。运算对象可以是变量、常量、函数等。算术表达式中运算符的结合方向为“从左至右”;*,/,%运算的优先级高于+,-运算,可以使用圆括号改变优先级别。
如:表达式3+4*3/2-1,按照从左至右的顺序,先计算优先级别较高的*、/运算,4*3,结果为12,12/2,结果为6,6和左边的3进行加法运算,得到结果9,最后计算9-1,结果为8。
(2)对于除法运算“/”,如果运算符两边的运算对象都是整数,则运算结果也是整数。如:5/2的结果为2,而不是2.5,小数部分被舍去了。
(3)对于模运算符“%”,要求其左右两边的运算对象都为整数,结果也为整数,即只有整数才能进行求余运算;
(4)“+,-”运算符有时作为正值运算符(+)和负值运算符(-),此时“+、-”变为单目运算符。如:+3,-6。
    3.1 算术运算符和算术表达式
#include<stdio.h>
void main()
{
        int a=3,b=4;
        printf("a+b/4%2-2.5=%f\n",a+b/4%2-2.5);  /* 从左至右,按照优先级别运算 */
        printf("4*a/b=%d,a/b*4=%d\n",4*a/b,a/b*4); /* 两个表达式结果不同,不满足数学中的
交换律 */
        printf("9/4=%d,-9/4=%d",9/4,-9/4);    /* 两个整数做除法运算,所得结果也是整数*/
}
程序运行结果:
a+b/4%2-2.5=1.500000
4*a/b=3,a/b*4=0
9/4=2,-9/4=--2
第二节 关系运算符与关系表达式
关系运算符相当于数学中的比较运算符,用于将两个值进行比较,判断比较的结果是否符合给定的条件。如a>5表示将a的值和5进行比较,判断a的值大于5是否成立。当a的值为8时,a的值大于5是成立的,该关系运算的结果为“真”,即符合给定的条件;当a的值为3时,a的值大于5是不成立的,该关系运算的结果为“假”,不符合给定的条件。
C语言中提供了6种关系运算符:
(1)>        大于
(2)>=        大于或等于
(3)<        小于
(4)<=        小于或等于
(5)==        等于
(6)!=        不等于
其中,前4个的优先级别相同,后2个的优先级别也相同。前4种的优先级别高于后2种的优先级别。与算术运算符相比,关系运算符的优先级别低于算术运算符。
用关系运算符将两个表达式连接起来的式子,称为关系表达式。其中,连接的表达式可以是变量、常量、算术表达式、关系表达式、逻辑表达式、赋值表达式等。
关系表达式的值是一个逻辑值,逻辑值有“真”和“假”。在C语言的逻辑运算中用“1”代表“真”,用“0”代表“假”。
例如:5>3的值为“真”,即表达式的值为1;
      3==0的值为“假”,即表达式的值为0。
3.2 关系运算符的应用及关系表达式的值。
#include<stdio.h>
void main()
{
    int a=3,b=4;
    printf("%d,%d\t",a+b==7,a+(b==7)); /* 优先级别低于算术运算符 */
    printf("%d\t",3==3<b);          /* “==”优先级别低于”<”  */
    printf("%d\n",b>a>1);          /*  先计算b>a,值为1,再比较1>1,值为0 */
}
程序运行结果:1,3          0          0
第三节 逻辑运算符与逻辑表达式
逻辑运算通常用来判断一个或多个条件的真假值。通过逻辑运算符连接多个条件,可以判别某一个给定的复合条件是否成立。
C语言提供了3种逻辑运算符:
(1)逻辑与“&&”:当且仅当两个运算对象的值都为“真”时,运算结果为“真”,否则为“假”;
逻辑与相当于“并且”。例如,a是一个能同时被2和5整除的数,a必须要满足的条件为,a能被2整除并且能被5整除。仅当两个条件都成立时,才能满足给定的条件。用C的表达式表示出来就是“a%2==0&&a%5==0”,当这个表达式值为“真”时,就表示a是一个能同时被2和5整除的数,否则数a就不是一个能同时被2和5整除的数。
(2)逻辑或“||”:当且仅当两个运算对象值都为“假”时,运算结果为“假”,否则运算结果为“真”;
逻辑或相当于“或者”。例如,b是一个绝对值不为0的数,只需要满足b<0或者b>0之中任意一个条件。只要两个条件中的其中一个成立就符合给定的条件。用C的表达式表示出来就是b<0||b>0,当这个表达式值为“真”时,b就是一个绝对值不为0的数。
(3)逻辑非“!”:属于单目运算符,当运算对象值为“真”时,运算结果为“假”,当运算对象的值为“假”时,运算结果为“真”。
三种逻辑运算符运算的优先次序为:
    (1)逻辑运算符的优先级别由高到低为:!,&&,||,即优先级别最高的为逻辑非(!)。
(2)逻辑运算符中的“!”优先级别高于算术运算符,而“&&”和“||”优先级别低于关系运算符。
例如:
x>3&&y>5与(x>3)&&(y>5)等价
x>3||x<-3与(x>3)||(x<-3)等价
!a+b&&a>3 与 ((!a)+b)&&(a>3)等价
逻辑表达式是指用逻辑运算符将一个或多个表达式连接起来的式子,常用来表示多个条件的组合。
例如,要判断某一年是否闰年,需要符合下列条件之一:
① 能被4整除,但不能被100整除
② 能被400整除
如果用year表示某一年份,则判断year是否闰年的组合条件可表示为:
(year%4==0&&year%100!=0)||year%400==0
也可表示为((year%4==0&&!(year%100==0))||year%400==0
当表达式值为“真”时,year为闰年,否则为非闰年。
与关系表达式一样,逻辑表达式的值也是一个逻辑量,“真”或“假”。如前所述,C语言中用1代表“真”,用0代表“假”。因此,逻辑表达式的值要么为1,要么为0。
需要注意的是,在将一个量作为逻辑量来判断真假时,以0代表“假”,以非0代表“真”。也就是说,在C语言中,只要是一个非0的数,都作为“真”来处理。数据的逻辑运算真值表如表3-1所示。
3-1 逻辑运算真值表
a
b
!a
!b
a&&b
a||b
0
0
0
0
1
1
0
0
0
1
0
1
0
0
1
运算符优先级图片0
0
1
0
0
1
1
0
0
3.3 逻辑运算符及其表达式的值。
#include<stdio.h>
void main()
{
    int a=3,b=0;
    float x=3.5,y=0.0;
    char c='a';
    printf("%d,",a&&b);  /* 非0判断为“真”,0判断为“假”*/
    printf("%d,",x&&y);  /* 浮点数也可作为逻辑运算的运算对象 */
    printf("%d\n",c||'n');    /* 字符型作为运算对象时,以ASCII码值判别真假*/
}
程序运行结果:0,0,1
关于逻辑运算符的几点说明:
(1)逻辑运算符的运算对象,可以是0或非0的整数,也可以是其他任何类型的数据,如实型、字符型等,系统最终按照“0”和“非0”来判定其“真”或“假”。
例如:’a’&&’b’  值为1。
对于字符型数据,系统按照它们的ASCII码值来处理,a的ASCII码值为97,b的ASCII码值为98,都为非0,系统按照“真”来处理,表达式的值为1。
(2)在求解逻辑表达式的过程中,只是在必须执行下一个逻辑运算符才能求出表达式的结果时,才执行该运算符,而不是所有的逻辑运算符都被执行。如:
    ① 对于逻辑与运算,如果第一个运算对象被判定为“假”,则无论第二个运算对象是“真”
或“假”都不会影响表达式的结果。因此,系统将不再判定或求解第二个运算对象。
例如:a&&b&&c
当a为“假”时,表达式值为“假”,系统不再判断求解b和c,只有当a为“真”时,才判断b,只有当a和b都为“真”时,才需要判断求解c。如图3-1所示。
② 对于逻辑或运算,如果第一个运算对象为“真”,则无论第二个运算对象是“真”或“假”,表达式的值都为真。因此,系统将不再判定或求解第二个运算对象。
例如:a||b||c
当a为“真”时,表达式值为“真”,系统不再判断求解b和c,只有当a为“假”时,才判断b,只有当a和b都为“假”时,才需要判断求解c。如图3-2所示。
3.4 逻辑运算符的运算规则。
    #include<stdio.h>
void main()
{
      int a=1,b=2,c=3,d=0;
      int m=2,n=2;
      int x=2,y=2;
      (m=a>b)&&(n=c>d);      /* n=c>d没有被执行 */
      (x=a<b)||(y=c<d);        /* y=c<d没有被执行 */
      printf("m=%d,n=%d,",m,n);
      printf("x=%d,y=%d\n",x,y);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。