第三章 运算符和表达式

第三章  运算符和表达式
第三章  运算符和表达式

第三章运算符和表达式

3.1 运算符和表达式概述

使用运算符可以对运算对象(包括常量和变量)进行计算以得到计算结果。用运算符将运算对象连接成一个符合C语言语法规则的式称为表达式。另外,C语言中的表达式是可以嵌套的,即简单表达式经过运算符连接后还可以形成更为复杂的表达式。

根据运算符所连接的运算对象(操作数)的个数,可以将C语言中的运算符分为三类:

(1) 单目(一元)运算符:只连接一个操作数的运算符。

(2) 双目(二元)运算符:带有两个操作数的运算符。

(3) 三目(三元)运算符:同时对三个操作数进行计算的运算符。

C语言中的表达式可以分为三类:

(1) 单个常量或者单个变量是最简单的表达式。

(2) 带有运算符的表达式。

(3) 函数调用。

任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果。所以运算对象、运算符和运算结果是运算的三大要素。

3.2 算术运算符和算术表达式

一、基本算术运算符和简单算术表达式

1. 基本算术运算符

C语言为用户提供的基本算术运算符包括:+(加)、-(减)、*(乘),/(除)、%(求余),这些运算符都是双目运算符,也即在生成算术表达式的时,基本算术运算符左右两侧都必须出现运算对象。

2. 简单算术表达式

当用基本算术运算符去连接常量或者变量时,就形成简单算术表达式。简单算术表达式的基本形式:data1 op data2。data1和data2表示某个常量或者变量,op代表上述5个基本算术运算符之一。假设有变量定义:int a=20,b=-5;则a+b、a-b、a*-2、20/-b、20%6、a%b等都是简单算术表达式。

3. 基本算术运算符使用说明

(1) +、-、*,/既可以连接整型数据,也可以连接实型数据。当参与这4个运算符的运算对

象都是整型数据时,得到整型数据运算结果;否则表示浮点运算。例如,int a=15,b=2;

则a*b等于30,而a/b等于7;a*2.0等于30.0,而a/2.0等于7.5。

(2) 在使用除法运算符时要注意右操作数(除数)不能为零。

(3) 取余运算%只能对整型数据取余。另外,由于取余实质上是先进行除法运算,然后得到

相除后的余数,所以和除法运算符一样,右操作数不能为零。例如,int a=15,b=0;double d=3.0;则a%b和a%d都是非法的表达式。

【例3.1】调用函数printf打印表达式的值。

#include

main()

{

int a=15,b=20;

printf("%d--%d \n",a,15);

printf("%d+%d=%d\n",a,b,a+b);

printf("15+20=%d\n",15+20);

printf("%d+5=%d\n",a,a + 5);

}

说明:

(1)printf不仅能打印单个常量或者单个变量的值,还能将任意的有值表达式的值打印在

控制台屏幕上。

(2) 操作数和运算符之间可以有空白符,见本例程序中的“a + 5”。

【例3.2】测试更多的算术运算符。

#include

main()

{

int i=7,j=2;

double d=2.0;

printf("%d%%%d=%d\n",i,j,i%j);

printf("%d%%%d=%d\n",j,i,j%i);

printf("%d/%d=%d\n",i,j,i/j);

printf("%d/%f=%f\n",i,d,i/d);

}

说明:

(1) %是格式说明符的起始字符,需要用%%来打印%,见本例程序第6行和第7行。

(2) 从程序第8行和第9行的运行结果中不难看出,当两个整型数据参与除法运算时结果为

整数,否则为浮点数。

4. 字符的算术运算

第二章中提到过,由于字符在内存中是用ASCII码存储的,而ASCII码就是一个整数,所以字符数据和整型数据是兼容的,即可以把字符赋给整型变量,也可以把整数赋给字符变量,还可以用转换字符c或d输出字符数据和整型数据。兼容性还体现在能让字符数据参与算术运算。

【例3.3】对字符进行算术运算。

#include

main()

{

char ch1='A',ch2='a';

int i=0x20;

printf("%d,%d\n",ch1+0x20,ch2-i);

printf("%c,%c\n",ch1+0x20,ch2-i);

}

说明:字符数据参与算术运算时,实际是用该字符的ASCII码值进行相应的计算。

二、自增(++)和自减运算(- -)

++和--是两个单目的算术运算符,作用是使变量当前的值加1或减1。

当++或--放在变量名前面时,称为前自增或前自减运算;当++或—放在变量名后面时,称为后自增或后自减运算。以++为例,前自增运算是先对变量值加1运算,再使用变量的值(自增以后的值);后自增运算是先使用变量原来的值,再对变量值加1。

【例3.4】比较前/后自增运算符的不同。

#include

main()

{

int a=2009,b=a;

printf("a=%d,b=%d\n",a,b);

printf("a++=%d\n",a++);

printf("a=%d\n",a);

printf("++b=%d\n",++b);

printf("b=%d\n",b);

}

说明:

(1) ++和—主要用来改变变量的值,所以它们的操作数不能是数值。例如,4++;就是一条

非法语句。

(2) 使用时只连接一个操作数的运算符为单目运算符(或叫一元运算符),所以sizeof和&

都是单目运算符。sizeof可以计算某一类型数据存储时占据的内存字节数,例如sizeof(变量名);&用于获得变量的地址,例如,&变量名。

【例3.5】分析以下程序的运行结果。交换第5行与第6行后,程序的运行结果?

#include

main()

{

int a=2010;

printf("%d\n",--a);

printf("%d\n",a--);

printf("%d\n",a);

}

说明:通常,只在单一地对变量加1或减1的情况下才使用自增或自减运算符。如果让自增/自减运算参与其他操作,有可能会出现意想不到的副作用。

【例3.6】自增/自减运算符的副作用。

#include

main()

{

int i=2009;

printf("i=%d,i++=%d\n",i,i++);

}

说明:本例在VC6.0下运行的结果为:i=2009,i++=2009;而在TC2.0下运行的结果为:i=2010,i++=2009。

三、算术运算符的优先级和结合性

本章开篇时提到过,可以将一个表达式嵌套在另一个表达式中,另一个等价的说法就是可以用运算符去连接表达式。

当用基本算术运算符连接常量或变量时可以形成最简单的算术表达式,而常量和变量本身就是最简单的有值表达式,所以事实上可以用基本算术运算符去连接两个有值表达式,即expression1 op expression2,这里的expression1和expression2表示有值表达式,而op则代表5个基本算术运算符。例如,a*b+2009(其中a、b为int变量)、3.5-2.0+d (d 为double变量)。

1. 运算符的优先级

当一个表达式中使用了多个运算符时,由运算符的优先级决定到底哪一运算先进行。算术运算符的优先级如表3-1所示。

表3-1 算术运算符的优先级表

所以在计算a*b+2009时,由于变量b左边的乘法运算符*的优先级高于右边的加法运算符+,所以该表达式应先执行乘法运算,后计算加法(将乘法运算的结果和常量2009相加)。

2. 运算符的结合性

那么对于表达式“3.5-2.0+d”怎么计算?因为变量d左右两边的运算符+和-的优先级是相同的。由此可见,当某个常量或者变量左右两边的运算符的优先级相同的时,无法通过优先级来决定运算符执行的先后顺序,这时需要由结合性来判定运算顺序。算术运算符的优先级和结合性如表3-2所示。

根据结合性,在计算3.5+d-2.0时,由于加法运算符+和减法运算符是左结合,即变量d先和左边的加法运算相结合,所以该表达式应先执行加法运算,后计算减法(将加法运算的结果和常量2.0相减)。

若想不受优先级和结合性的制约,人为地改变运算的先后顺序,则可以使用括号。例如,对于表达式“a*b+2009”,若想强制先执行加法运算,则需对加法子表达式使用括号——a*(b+2009),对于表达式“3.5+d-2.0”,若想强制先执行减法运算,则需对减法子表达式使用括号——3.5+(d-2.0)。

3. 复杂表达式的计算

在计算复杂表达式时,常常可以应用算符优先算法的基本思想——先从左往右扫描整个表达式,一旦发现表达式中某个变量或者常量左边运算符的优先级高于右边运算符的优先级时,就执行左边运算。然后对经过化简的表达式按照上述过程继续化简,直到所有运算执行完毕为止。

【例3.7】若有定义语句:int s=6;则表达式s%2+(s+1)%2的值为。

分析:根据算符优先算法的基本思想,本例表达式中运算符的计算顺序如下:

s%2+(s+1)%2 → 0+(s+1)%2 → 0+7%2 → 0+1 → 1

【例3.8】算术运算符的优先级和结合性

#include

main()

{

int a=5,b=4;

printf("a=%d,b=%d\n",a,b);

printf("a+b%%3*a+b%%2/4=%d\n",a+b%3*a+b%2/4);

printf("a++/--b=%d\n",a++/--b);

printf("++a*a++=%d\n",++a*a++);

printf("++a*10+15/b++=%d\n",++a*10+15/b++);

printf("a=%d,b=%d\n",a,b);

}

3.3 赋值运算符和赋值表达式

一、基本赋值运算符和赋值表达式的一般形式

1. 基本赋值运算符

在第2章中,我们已经接触过对变量的赋值运算,它的作用是将数据存储在某个变量中(赋值运算实质上就是将数据写入到某个变量中)。例如:

int i,j=-20,k;

i=j;

k=30;

当定义变量和对变量赋值在同一行进行时,称为对变量初始化。

2. 赋值表达式的一般形式

我们既可以使用常量,也可以使用另一个变量的值对某个变量赋值,而常量和变量是最简单的有值表达式,所以赋值表达式的更一般的形式为:变量=有值表达式。

说明:

(1) 赋值运算符是双目运算符,出现在“=”左边的一定是个变量,右边的是一个有值表达

式,运算含义是将有值表达式的结果存入左边的变量中。

(2)赋值运算的结果是经过赋值以后“=”左边的变量值。

(3) 赋值运算符的优先级在C语言所有运算符中排倒数第二(仅高于逗号运算符)。

(4) 赋值运算符的结合性是右结合。

(5) 我们已经学过的有值表达式包括:常量、变量、算术表达式(包括自增、自减表达式)

和赋值表达式。假设有如下变量定义:int a=2,b=4,c,d;则:c=a+b、c=a++、d=--b、d=c=a等都是赋值表达式。

【例3.9】基本赋值运算测试。

#include

main()

{

int a=3,b=-4,c,result;

result=a+b;

printf("%d+%d=%d\n",a,b,result);

printf("%d\n",c=b);

printf("%d\n",c=c+1);

a=b=c+-5;

printf("a=%d,b=%d,c=%d\n",a,b,c);

a=(b=c)+-5;

printf("a=%d,b=%d,c=%d\n",a,b,c);

}

说明:

(1) 表达式“c=c+1”相当于“++c”,而不是“c++”!

(2) 要根据运算符的优先级和结合性,应用算符优先算法的基本思想去计算带有多个运算符

的复杂表达式。

二、复合赋值运算符和复合赋值表达式

C语言进一步将算术运算符、位运算符同基本赋值运算符结合起来构成复合赋值运算符。复合赋值运算符分为算术复合赋值运算符和位复合赋值运算符两类,具体如下:+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=。复合赋值表达式的基本形式为:变量名 op=有值表达式,op是指5个基本算术运算符(+、-、*、/、%)和5个位运算符(&、|、^、<<、>>)。

计算复合赋值表达式时可进行等价转换:“变量名 op=有值表达式”等价于“变量名= 变量名 op 有值表达式”。例如,int a=5;则a+=3等价于a=a+3,int x=2,y=3;则x*=y+8 等价于x=x*(y+8)。

复合赋值运算符的优先级、结合性和基本赋值运算符相同。

【例3.10】若a是int变量,且a的初值为6,则计算表达式后a的值为。

a += a -= a * a

说明:本例的计算过程如下:a+=a-=a*a → a+=a-=36 → a+=-30(a=-30) → -60(a=-60)。【课内思考题3.1】设有说明语句:int k=7,x=12;则以下能使值为3的表达式为。

A) x%=(k%=5) B) x%=(k-k%5)

C) x%=k-k%5 D) (x%=k)-(k%=5)

【课内思考题3.2】若x和n均是int变量,且x和n的初值均为5,则计算表达式“x += ++n”后x的值为,n的值为。

【课内思考题3.3】若有以下定义int m=5,y=2;则计算表达式y += y -= m *= y后y的值是。

三、根据变量的数据类型赋值

【例3.11】赋值时要注意目标类型的取值范围。

#include

main()

{

short si=32800;

printf("si=%d\n",si);

}

说明:本例程序的运行结果为“si=-32736”。注意到变量si是short类型,通常占2个字节,取值范围-32768~32767。现在将常量32800赋给变量si,显然超过了short类型的表示范围。

【课内思考题3.4】分析以下程序的运行结果:

#include

main()

{

short si=-32800;

printf("si=%d\n",si);

}

3.4 类型转换运算

一、普通算术类型转换规则

C语言规定,当不同数据类型的操作数参加同一运算时,必须将它们统一成同一数据类型,也就是要将其中一个操作数的数据类型转换成另一个操作数的数据类型。在进行类型转换时,应尽量遵照普通算术类型转换规则,这样才不会丢失运算结果的精度。下面引用1988年C语言的美国国家信息系统标准中关于这一个规则的详细内容。

如果任何一个操作数为long double类型,则将另一个操作数转换为long double类型。

否则,如果任何一个操作数为double类型,则将另一个操作数转换为double类型。

否则,如果任何一个操作数为 float类型,则将另一个操作数转换为float类型。

否则,同时对两个操作数进行整型提升;如果任何一个操作数为unsigned long int 类型,则将另一个操作数转换为unsigned long int类型。

(注:总能将一个有符号数(补码)理解成一个无符号数。也即同一类型的无符号数可以表示有符号数,比如unsigned long能表示long)

否则,如果一个操作数为long int类型且另一个操作数为unsigned int类型,则结果依赖于long int类型是否可以表示所有unsigned int类型的值。如果可以,则将unsigned int类型的操作数转换为long int;如果不可以,则将两个操作数都转换为unsigned long int类型。

否则,如果一个操作数为long int类型,则将另一个操作数转换为long int类型。

否则,如果任何一个操作数为unsigned int类型,则将另一个操作数转换为unsigned int类型。

否则,将两个操作数都转换为int类型。

从上述规定不难看出,普通算术类型转换规则的实质,是将能表示数据范围较小的数据类型,向能表示数据范围较大的数据类型转换。

【例3.12】若有以下变量定义:

double d=-128.5;

float f=32.25;

unsigned long ul=298UL;

long l=-20L;

unsigned int ui=125u;

unsigned short int usi=56;

char ch;

按照普通算术类型转换规则说明以下表达式正确的类型转换:

d+ul、1.234+f*l、ui+ch、usi+’#’、ui+l(c-free中)、ui*l(tc中)。

二、类型转换

根据类型转换时是否使用类型转换运算符,可将类型转换分为隐式类型转换(自动类型转换)和显示类型转换(强制类型转换),其中在进行强制类型转换时用户需要使用类型转换运算符。

1. 隐式类型转换

编译器按照普通算术类型转换规则对参加同一运算的操作数类型进行自动转换,但允许赋值运算可以违背类型转换规则。隐式类型转换过程中如果违背了普通算术类型转换规则,一个好的编译器会向用户发出warning(警告信息)。

【例3.13】测试隐式转换语法。

#include

main()

{

float y,z=242.5f;

unsigned x=2;

short s=4;

y=10+'b'+5.7*x+z/'a'-s*12.5;

printf("y=%f",y);

}

说明:

(1) 本例程序第7行的复杂表达式“y=10+'b'+5.7*x+z/'a'-s*12.5”计算过程如下:

(2) 本程序在编译时产生了一个warning,原因在于,程序中的表达式的最终类型为double,

而存储该表达式值的变量y的类型是float,虽然编译器允许double到float的隐式转换,但这一转换显然违背了普通算术类型转换规则,存在精度丢失的风险!

2. 强制类型转换

强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,随后紧跟待转换的常量、变量名或待转换的表达式。例如:

double x=3.6,y=-2.8;

int nx1,nx2,nx3;

nx1=(int)x;

nx2=(int)(x+y);

nx3=(int)x+y;

说明:

(1) 强制类型转换通过截断小数部分来把一个浮点值转换为整型,所以变量nx1的值为3。

虽然经过强制类型转换,但变量x的数据类型和值都未发生变化(值仍然为3.6)。

(2) 表达式“(int)(x+y)”是把x+y的结果转换为int,所以该表达式的结果为0。

(3) 类型转换运算符用来连接一个常量、变量或一个表达式,所以是单目运算符。它的优先

级在C语言所有运算符中排第二(和++、--相同),结合性是右结合。所以在计算表达式“nx3=(int)x+y”时,先对x的值进行类型转换得到3,然后和变量y的值相加,进行隐式转换,得到和为0.2,最后执行赋值运算,变量nx3的值就是0.2。

【例3.14】测试显式转换语法。

#include

main()

{

double d=123.456;

int a=17.7,b=8;

printf("(int)3.1415926=%d\n",(int)3.1415926);

printf("(int)d=%d\n",(int)d);

printf("d=%f\n",d);

printf("d+10=%f\n",d+10);

printf("(int)(d+10)=%d\n",(int)(d+10));

printf("17/8=%d\n",a/b);

printf("17/8=%f\n",(double)a/b);

printf("%f\n",(double)a/b-a/b);

}

说明:

(1) 在将常量17.7赋给变量a时,编译器执行隐式类型转换,变量a的值为17。在赋值运

算中如果使用了隐式类型转换,不论是否会违背普通算术类型转换规则,编译器一律将赋值运算符号右边的运算对象的值,转换成赋值号左边的变量类型。

(2) 程序的第6行和第7行通过强制类型转换,分别在屏幕上打印常量3.1415926的整数部

分3和变量d的值的整数部分3。

(3) 接着在程序的第8行将变量d的值打印出来,这样就能看出强制类型转换对变量d的值

是否会产生影响。

(4) 程序第9行在计算表达式“d+10”的结果时,,编译器要先进行隐式类型转换,根据普

通类型转换规则,将10转换成double常量10.0,再进行加法运算,得到和133.456,最后打印结果。

(5) 两个整型数据相除以后的结果是整数商,例如程序第10行表达式“a/b”的结果为2。

如果想同时得到商的小数部分,就可以对其中任何一个整型数据进行强制类型转换,例如“(double)a/b”,结果2.125。如果仅想得到商的小数部分呢?只需要用完整商减去商的整数部分即可,也就是“(double)a/b-a/b”。

(6) 如果试图将数据从一种类型强制转换成另一种数据类型,而又超出了目标类型的表示范

围,结果就会被截断为成一个完全不同的数值。例如下面这个程序的运行结果为-32736。 #include

main()

{

printf("%d\n",(short)32800);

}

3.5 逗号运算符和位运算符

一、逗号运算符和逗号表达式

C语言提供了一种特殊的运算符:逗号运算符,通过逗号运算符可以将两个表达式连接起来形成逗号表达式:表达式1,表达式2。所以逗号运算符是双目运算符。

当然可以用逗号运算符去连接两个逗号表达式:

表达式1,表达式2,表达式3,表达式4。

将上述过程推广下去,就得到逗号表达式的更一般形式:表达式1,表达式2,…,表达式n。

逗号运算符在C语言所有的运算符中优先级最低,结合性是左结合,所以在计算逗号表达式时先计算逗号左边的表达式,再计算逗号右边的表达式,整个逗号表达式的结果是逗号右边表达式的值。

【例3.15】分析下面的逗号表达式的计算结果。设有如下变量定义:int a=10,x; (1)a=3*5,a*4 (2)(a=3*5,a*4),a+5 (3) x=(a=3,6*3) (4) x=a=3.6*a

二、位运算符和位运算表达式

在处理整型数据(包括字符数据)时,通过C语言可以直接对整型数据的位模式(二进制补码)中的各个位进行操作。C语言提供给用户使用的位运算符包括:按位与(&)、按位或(|)、按位取反(~)、按位异或(^)、左移(<<)、右移(>>)六种,其中位反运算符~是单目运算符,其余的运算符都是双目运算符。另外所有的双目位运算符还能和赋值运算符结合成复合赋值运算符。有关位运算符的优先级和结合性请参见下面的“C语言运算符优先级和结合性”表。

1. 位与、位或和位非运算

【例3.16】使用位运算符对整型数据的位模式(补码)进行操作。

#include

main()

{

short n=-57;

int thirdbitfromright=(n&4)/4;

printf("%d的补码从右数第3位为%d\n",n,thirdbitfromright);

printf("~%d=%d\n",n,~n);

printf("%d|0=%d\n",n,n|0);

}

(1) -57在变量n中是以2字节补码形式存储的。-57的16位补码为1111111111000111。

(2) n&8即为1111111111000111 & 0000000000000100=0000000000000100,所以结果为4。

(3) ~n即为0000000000111000,所以结果为56。

(4) n|0即为1111111111000111 | 0000000000000000=1111111111000111,所以结果为-57。

2. 左移和右移运算符

“>>”和“<<”运算符能将二进制位右移或左移。

【例3.17】使用“>>”和“<<”获取位模式中的指定位。

#include

main()

{

short n=-57;

int thirdbitfromright=(n&(1<<2))>>2;

printf("%d的补码从右数第3位为%d\n",n,thirdbitfromright);

}

说明:

(1) “1<<2”表示将1的补码的每一位向左移动2位,即为00…0100,所以结果为4。

(2) 右移运算符实现将整型数据所对应的补码往右移n位,那么最低的n位就被丢掉了,对

空出的高位,不同的编译器采用不同的填充方法:有的编译器根据补码的符号位填充高位;有的编译器对空出的高位一律补0。在通常情况下,只对正整数使用右移运算符。

三、C语言运算符的优先级和结合性

(1) 除了所有的单目运算符(优先级第二)、条件运算符(?:)和赋值运算符(包括复合的赋值

运算符)的结合性是从左至右以外,其他运算符一律左结合。

(2) 逗号运算符的优先级最低,赋值运算符和复合赋值运算符的优先级次低。

(3) 常用的双目运算符(除位运算符外)中,算术运算符>关系运算符>逻辑运算符(&&和||)。

四、运算符和表达式使用小结

【例3.18】已知各变量的类型说明如下:

int k,a,b,c=0,d=8;

unsigned long w=5;

double x=1.42,y;

则以下不符合C语言语法的表达式是。

A) x%(-3) B) w+=-2 C) a=a*3=2 D) a=d%c+5 E) k=(a=2,b=3,a+b) F) a+=a-=(b=4)*(a=3) G) y=(double)d+3

【例3.19】以下正确的叙述是。

A) 在C程序中,每行中只能写一条语句

B) 若a是实型变量,C程序中允许赋值a=10,因此实型变量中允许存放整型数

C) 在C程序中,无论是整数还是实数,都能被准确无误地表示

D) 在C程序中,%是只能用于整数运算的运算符

【例3.20】若有定义:int a=7;float x=2.5,y=4.7;则表达式x + a % 3 * (int)(x+y)% 2/4的值是。

A) 2.500000 B) 2.750000 C) 3.500000 D) 0.000000

【例3.21】sizeof(float)是。

A) 一个双精度型表达式 B) 一个整型表达式

C) 一种函数调用 D) 一个不合法的表达式

【例3.22】设以下变量均为int类型,则值不等于7的表达式是。

A) (x=y=6,x+y,x+1) B) (x=y=6,x+y,y+1)

C) (x=6,x+1,y=6,x+y) D) (y=6,y+1,x=y,x+1)

【例3.23】若有定义:int b=7; float a=2.5,c=4.7; 则下面表达式的值为。a+(int)( b * (int)(a+c)/2 )%4

【例3.24】假设所有变量均为整型,则表达式(a=2 , b=5 , a++ , b++ , a+b)的值为。

C语言第三章表达式与运算符笔记

3.1概述 1.C语言表达式:用C语言运算符将常量、变量、函数调用连接起来的有意义的式子。.C语言的表达式为算术表达式、赋值表达式、逗号表达式、条件表达式、关系表达式和逻辑表达式。 2.表达式的值的类型取决于参与运算的数据的类型。 3.关系运算表达式成立,则结果为1,代表“真”,否则结果为0,代表“假”。4.运算符按参与运算的对象个数可以分类:单目运算符、双目运算符和三目运算符。 3.2算术运算符与算术表达式 1.除法运算:当两个操作数都是整型时,除法视为整除,运算结果舍去小数部分,只保留整数部分。 2.取模运算(求余):运算结果为一个整型,这个数是整除运算的余数,符号与被除数符号相同。例如:8%3的结果是3,8%(-5)的结果是3。 3.取负运算(单目运算),即只有一个操作数参与运算。 4.注意:’\%’与’%%’都相同于显示% 5.算术运算符的优先级:括号、函数调用、取负、*/%、+- 6.结合性:从左至右。 3.3其他运算符的应用 3.3.1赋值运算符和赋值表达式 1.一般形式:变量赋值运算符表达式例如:a=5+10 2.赋值表达式的计算过程:首先计算表达式的值,然后将该值赋给左侧的变量。 3.复合的赋值运算:+=,-=,*=,/=,%=等例如:a+=b等价于a=a+b 4.说明:(1)赋值号左边只能是变量,不允许出现常量、函数调用和表达式。 (2)赋值表达式中的“表达式”,又可以是另一个赋值表达式。 (3)当赋值号两边的数据类型不同时,一般由系统自动进行类型转换。

其原则是,赋值号右边的数据类型转换成与左边的变量相同的数据类型。 3.3.2自增自减运算符 1.功能:自增、自减运算符的作用是使变量的值增1或减1。 2.当自增、自减运算符的前置(在变量之前)变量本身先自增(或自减),然后再参与运算; 3.当自增、自减运算符的后置(在变量之后)变量先参与运算,然后变量本身再自增(或自减)。 注:自增、自减运算符只能用于整型变量,不能用于常量或表达式。 4.-i++相当于-(i++) 从右至左的右结合性 5.i+++j相当于(i++)+j 3.3.3条件运算符和条件表达式 1.一般形式:表达式1?表达式2:表达式3 2.条件表达式的执行过程:首先计算表达式1,如果非0(真)则计算表达式2,表达式2的值作为条件表达式的值;如果表达式1的值为0(假),则计算表达式3,表达式3的值作为条件表达式的值。 3.3.4逗号运算符和逗号表达式 1.一般形式:表达式1,表达式2,……,表达式n 2.逗号表达式的计算过程是:先计算表达式1,再计算表达式2,依次计算直到表达式n,表达式n,表达式n的值是整个逗号表达式的值。 3.3.5 sizeof运算符 1.一般形式:sizeof(类型名或变量名) 类型名可以是基本类型名,也可以是其他的构造类型名 2.功能:sizeof运算给出指定类型在内存中所占的字节数。 数学函数 1.fabs(x) 求x的绝对值

第三章 运算符和表达式

第三章运算符和表达式 3.1 运算符和表达式概述 使用运算符可以对运算对象(包括常量和变量)进行计算以得到计算结果。用运算符将运算对象连接成一个符合C语言语法规则的式称为表达式。另外,C语言中的表达式是可以嵌套的,即简单表达式经过运算符连接后还可以形成更为复杂的表达式。 根据运算符所连接的运算对象(操作数)的个数,可以将C语言中的运算符分为三类: (1) 单目(一元)运算符:只连接一个操作数的运算符。 (2) 双目(二元)运算符:带有两个操作数的运算符。 (3) 三目(三元)运算符:同时对三个操作数进行计算的运算符。 C语言中的表达式可以分为三类: (1) 单个常量或者单个变量是最简单的表达式。 (2) 带有运算符的表达式。 (3) 函数调用。 任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果。所以运算对象、运算符和运算结果是运算的三大要素。 3.2 算术运算符和算术表达式 一、基本算术运算符和简单算术表达式 1. 基本算术运算符 C语言为用户提供的基本算术运算符包括:+(加)、-(减)、*(乘),/(除)、%(求余),这些运算符都是双目运算符,也即在生成算术表达式的时,基本算术运算符左右两侧都必须出现运算对象。 2. 简单算术表达式 当用基本算术运算符去连接常量或者变量时,就形成简单算术表达式。简单算术表达式的基本形式:data1 op data2。data1和data2表示某个常量或者变量,op代表上述5个基本算术运算符之一。假设有变量定义:int a=20,b=-5;则a+b、a-b、a*-2、20/-b、20%6、a%b等都是简单算术表达式。 3. 基本算术运算符使用说明 (1) +、-、*,/既可以连接整型数据,也可以连接实型数据。当参与这4个运算符的运算对

[java入门学习]第 3 章 运算符和表达式.

第 3 章运算符和表达式 运算符指明对操作数所进行的运算。按操作数的数目来分,可以有一元运算 符 (如 ++、--,二元运算符(如 +、>和三元运算符 (如?:,它们分别对应于一个、两个和三个操作数。对于一元运算符来说 ,可以有前缀表达式 (如++i 和后缀表达式 (如 i++,对于二元运算符来说则采用中缀表达式(如a+b。按照运算符功能来分,基本的运算符有下面几类 : 1.算术运算符 (+,-,*,/,%,++,-- 2.关系运算符 (>,<,>=,<=,==,!= 3.布尔逻辑运算符 (!,&&,|| 4.位运算符 (>>,<<,>>>,&,|,^,~ 5.赋值运算符 (=,及其扩展赋值运算符如+= 6.条件运算符 ( ?: 7.其它 (包括分量运算符·,下标运算符 [],实例运算符 instance of,内存分配运算符new,强制类型转换运算符(类型,方法调用运算符 ( 等 本章中我们主要讲述前6类运算符。 § 3.1算术运算符 算术运算符作用于整型或浮点型数据 ,完成算术运算。 一、二元算术运算符 如下表所示运算符用法描述 + op1+op2 加 - op1-op2 减 * op1*op2 乘 / op1/op2 除 % op1%op2 取模(求余

Java对加运算符进行了扩展,使它能够进行字符串的连接 ,如 "abc"+"de",得到 串 "abcde"。我们将在第七章中讲解。与C、 C++不同,对取模运算符%来说,其操作数可以为浮点数, 如 37.2%10=7.2。 二、一元算术运算符 如下表所示 : 运算符用法描述 + +op 正值 - -op 负值 ++ ++op,op++ 加1 -- --op,op-- 减1 i++与 ++i的区别 i++在使用i之后,使 i的值加 1,因此执行完 i++后,整个表达式的值为 i,而 i的值变为 i+1。 ++i在使用i之前,使 i的值加 1,因此执行完 ++i后 ,整个表达式和 i的值均为 i+1。 对 i--与 --i同样。 例 3.1.下面的例子说明了算术运算符的使用 public class ArithmaticOp{ public static void main( String args[] { int a=5+4; //a=9 int b=a*2; //b=18 int c=b/4; //c=4 int d=b-c; //d=14 int e=-d; //e=-14 int f=e%4; //f=-2 double g=18.4;

【实验三】运算符与表达式

【实验三】运算符与表达式 【实验名称】运算符与表达式 【实验目的】 1. 掌握C语言中算术运算符和自增、自减运算符的运用。 2. 掌握C语言中一般实数除法和整除的运用。 3. 掌握C语言中3种不同的数据类型转换方法。 4. 掌握条件运算符、关系运算符、逻辑运算符的基本功能,并能够根据问题设计出正确的逻辑表达式。 【实验学时】2学时 【实验要求】 1.建立新的工作区完成本次实验,进一步熟练运用工作区,工程和源程序的模式完成各实验内容。 2.实验内容的第2,3,4项为验证型实验,程序录入时注意使用英文半角状态输入,要求所输入程序结构完整无错误,代码包含必要的缩进。 3.实验内容的第1,5项为综合型实验,采用补充或者改编的方式使用程序完整且正确,能够分析和理解程序的运行,建议以多行注释形式在程序末尾添加实验体会。 4. 将5个源程序分别提交到网络课堂对应小题处。 【实验内容】 1. 熟练运用+、-、*、/、%运算符。以下程序的功能是拆分一个3位整数到整型变量a,b,c中,只运用+、-、*、/、%运算符并将(1)、(2)、(3)处补充完整,使得程序逻辑正确,同时建立工作区zm_sy03和工程sy03p1,并建立win32 Console Application命名为sy03p1.c,输入相关代码,最后将sy03p1.c上交到网 络课堂对应小题1处。 #include void main() { int a,b,c,x,y; printf("请输入一个三位整数 x="); scanf("%d",&x);

a= (1); b= (2); c= (3); y=c*100+b*10+a; printf(“%d\n",y); } 2. 学习如何使用实数除法和整除。在工作区zm_sy03下建立工程sy03p2,并建立源程序sy03p2.c,在sy03p2.c中输入以下代码。观察输出,给出a/b 和 a/c的结果不同的原因,最后将sy03p2.c上交到网络课堂对应小题2处。。 #include main( ) { int a,b; float c,s; a=8; b=5; c=5.0; s=a/b; printf("s=%f\n", s); s=a/c; printf("s=%f\n", s); } /* 在此处回答a/b 和a/c的结果不同的原因 */ 3. 掌握如何使用类型转换。在工作区zm_sy03下建立工程sy03p3,建立源程序sy03p3.c。在sy03p3.c中输入以下代码,验证并理解程序中各数据类型的转换方法,将运行结果以多行注释方式粘贴于源程序后方,最后上交sy03p3.c到 网络课堂对应小题3处。 #include void main( ) { char c; int a; double d; /*自动类型转换*/ d = 100+'A'+3.1415926; printf("d=%lf\n",d); /*存在赋值类型转换*/ c = 65; d = c;

(完整word版)C语言运算符与表达式的练习题答案

C语言运算符与表达式的练习题 单项选择题 (1)以下选项中,正确的 C 语言整型常量是(D)。 A. 32L B. 510000 C. -1.00 D. 567 (2)以下选项中,(D)是不正确的 C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" (3)字符串的结束标志是(C)。 A. 0 B. '0' C. '\0' D. "0" (4)算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为(B)。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运算、赋值运算 C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 (5)逻辑运算符中,运算优先级按从高到低依次为(D)。 A. && ! || B. || && ! C. && || ! D. ! && || (6)表达式!x||a==b 等效于(D)。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) (7)设整型变量 m,n,a,b,c,d 均为1,执行 (m=a>b)&&(n=c>d)后, m,n 的值是(A)。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 *(8)设有语句 int a=3;,则执行了语句 a+=a-=a*=a; 后,变量 a 的值是(B)。 A. 3 B. 0 C. 9 D. -12 (9)在以下一组运算符中,优先级最低的运算符是(D)。 A. * B. != C. + D. = (10)设整型变量 i 值为2,表达式(++i)+(++i)+(++i)的结果是(B,上机13)。 A. 6 B. 12 C. 15 D. 表达式出错 (11)若已定义 x 和 y为double 类型,则表达式的值是(D)。

第三章。运算符和表达式2、分支结构

Top 1.运算符和表达式-2 2.分支结构 1. 运算符和表达式-2 1.1. 赋值运算 1.1.1. 使用“=”进行赋值运算 “=”称为赋值运算符,用于对变量赋值。关于赋值运算符,除了将右边的表达式计算出来赋给左边以外还具备如下特点:赋值表达式本身也有值,其本身之值即为所赋之值。示例代码如下所示: 1.int num =18, index; 2.System.out.println(index = num %5);// 结果为:3,赋值表达式本身也有值 3.System.out.println(index);// 结果为:3 4.int a, b, c; 5. a = b = c =100; 6.// c=100 整个表达式的值为100,将其赋值给b,同样b=(c=100)整个表达式 的值也为100,然后有将这个值赋给了a,所以a 的值也是100。 1.1. 2. 使用扩展赋值表达式 在赋值运算符”= ”前加上其它运算符,即为扩展赋值运算符,其效率高于赋值运算符,推荐使用,扩展赋值运算符如下图- 5所示:

图- 5 1.2. 字符连接运算 1.2.1. 使用“+”进行字符串连接 “+”除了可以进行算术运算以外,还可以实现字符串的连接,同时可以实现字符串与其他数据类型的“相连”。 当+ 号作用于两个数字类型变量时,是在进行算术运算。 当+ 号两边的变量有一个是字符串类型,即””括起来的时候,则其进行的是字符串的连接,连接后的结果为字符串类型。示例代码如下所示: 1.int a =100; 2.String msg ="a="+ a; 3.System.out.println(msg);//a=100,字符串拼接 4.msg =""+100+200; 5.System.out.println(msg);//结果为: 100200,””+100,为字符串100再拼 上200为100200 6.msg =100+200+""; 7.System.out.println(msg);//结果为:300,100+200为算术运算结果为300, 再加上””为300 1.3. 条件(三目)运算 1.3.1. 使用条件(三目)运算符

第三章 数据类型、运算符与表达式 练习与答案

第三章数据类型、运算符与表达式 [试题分类]: 1.{ 下列程序执行后的输出结果是________________。 #define MA(x) x*(x-1) mian() \{int a=1,b=2; pirntf(“%d\n”,MA(1+a+b));\} } 试题编号:E54749 答案:8 题型:填空题 2.C语言中基本数据类型包括整型、实型、字符型。() 试题编号:E57279 答案:正确 题型:判断题 3.{ 要得到下列结果: a, b A, B 97,98,65,66 请按要求完善程序。 main( ) \{char c1,c2; c1=’a’;c2=’b’; printf(“%c,%c ”,c1,c2); printf(“%c,%c\n”, ___); printf(“%d,%d,%d,%d\n”,_c1,c2,c1-32,c2-32); \} } 试题编号:E55118 答案:c1-32,c2-32 题型:填空题 4.能表示“整型变量x的绝对值小于5”的表达式是___。(注意本题答案中规定不得使用系统函数)。 试题编号:E55113 答案:(x<5)&&(x>-5) 题型:填空题

5.设有定义"int a,b=10;",则执行语句"a=b<<2+1;"后a的值___。试题编号:E55111 答案:80 题型:填空题 6.设有定义"int x=4;",则表达式"x+=x*=x+1"的值是___。 试题编号:E55110 答案:40 题型:填空题 7.有下列运算符:>>、&&、|、!=,优先级别最高的是___。 试题编号:E55109 答案:>> 题型:填空题 8.用十进制来表示无符号短整型数据的数值范围是___。 试题编号:E55108 答案:0~65535 题型:填空题 9.{ 设有以下变量说明语句 char w='A'; int x=10; float y=20; double z=30; 则执行赋值语句 x=w*x+z-y; 之后x所得值的数据类是___。 } 试题编号:E55106 答案:int型 & 整型 题型:填空题 10.{ 设有变量说明语句 double d=5.4; int a,b; 则执行下述语句组的输出结果是___。 b=((a=2.1)+1.5)/3.6; d*=b; printf("%f\n",d); } 试题编号:E55104

C语言运算符与表达式的练习题

C语言运算符与表达式的练习题 (作业写到纸质作业本上,在规定时间内交给助教批阅,不要 再网上提交) 一、单项选择题 (1) 以下选项中,正确的C 语言整型常量是。 A. 32L B. 510000 C. -1.00 D. 567 (2) 以下选项中,是不正确的C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" (3) 在C 语言中,字符型数据在计算机内存中,以字符 的形式存储。 A. 原码 B. 反码 C. ASCII 码 D. BCD码 (4) 字符串的结束标志是。 A. 0 B. '0' C. '\0' D. "0" (5) 算术运算符、赋值运算符和关系运算符的运算优先级按 从高到低依次为。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运 算、赋值运算

C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 (6) 逻辑运算符中,运算优先级按从高到低依次为。 A. &&,!,|| B. ||,&&,! C. &&,||,! D. !,&&,|| (7) 表达式!x||a==b 等效于。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) (8) 设整型变量m,n,a,b,c,d 均为1,执行(m=a>b)&&(n=c>d)后, m,n 的值是。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 (9) int b=0,x=1;执行语句if(x++) b=x+1; 后,x,b 的值依次为。 A. 2,3 B. 2,0 C. 3,0 D. 3,2 (10) 设有语句int a=3;,则执行了语句a+=a-=a*=a; 后,变量 a 的值是。 A. 3 B. 0 C. 9 D. -12 (11) 在以下一组运算符中,优先级最低的运算符是。 A. * B. != C. + D. =

第3章表达式与运算符测试

C语言第3章《运算符与表达式》测试题 一、选择题(每题2分,共50分) 1、表达式“2,4,6,8”的值为() A.2 B.4 C.6 D.8 2、以下程序的输出结果是() main() {int a=12,b=0x12; printf(“%d%d\n”,--a,++b); } A.12 12 B.12 18 C.11 10 D.11 19 3、设x和y都是int型变量,则执行表达式“x=(y=4,z=16),k=32”后,x的值为() A.4 B.16 C.32 D、52 4、设x为int型变量,执行语句“x=’A’;x*=2+2;”后,的值为() A.65 B.260 C.132 D.语句错误 5、若有语句“int a=5;a++*2;”则表达式“a++*2”的值为() A.7 B.12 C.5 D.10 6、设x和y为int型变量,表达式“x+=y;y=x-y;x-=y;”的功能是() A.把x和y按从小到大排列 B.把x和y按从大到小排列 C.无确定结果 D.交换x和y的值 7、下面程序的输出结果是() main() {int x=’\23’; printf(“%d\n”--x); } A.19 B.18 C.23 D.24 8、若变量f已定义为float型, i为int 型,则下面()表达式(或语句)能够实现将f的数值保留小数点后两位,第3位进行四舍五入的运算。 A.f=(f*100+0.5)/100.0 B.i=f*100+0.5,f=i/100.0; C.f=(int)(f*100+0.5)/100 D.f=(f/100+0.5)*100.0 9、下面表达式正确的是() A. a+b=5 B.56=a11 C.5.6+6.2%3.1 D.a=5,b=6,c=7 10、若t为double型变量,执行逗号表达式“t=(x=0,x+5),t++;”的输出结果是()

运算符表达式习题三理完

一:选择题每题5分 1、设“int a=3,b=2;”,则++a*b的结果是()。 A.2 B.3 C. 8 D. 5 2、下列标识符合法的是(). A.8un B.void C. long D.abce 3、表达式“19/3*sqrt(4.0)/5;”的数据类型是() A.int B.float C.double D.不确定 4、关于下列语句中Z的说法,错误的是() Int x=3,y=5,z; //1 z=(x>0) ||(y<10); //2 z=(x==0) && (y<10); //3 z=!(x==3); //4 A.第二行的z为true. B. 第三行的z为false. C. 第四行的z为false. D.第二行的z为false; 5、设int a=3,b=4,c=5;表达式“(a+b)>c && b==c”的值是() A.2 B.-1 C.0 D.1 6、下列标识符不合法的为() A.A#B B._int C.a_10 D.Pad 7、while (!x)中的(!x)与下面条件()等价 A.x==1 B.x!=1 C.x!=0 D.x==0 8、下面语句哪个是非法的() A.int a=3,b=3; B.int a,b=3; C.int a=b=3; D.int a=3,b

9、下述语句执行后x的值() Int x,i=3; X=(i++)+(i++)+(i++); A. 9 B.15 C.0 D.12 10、设a=12,n=5,则表达式“a%=(n%=2)”运算后,a的值() A. 0 B.1 C.6 D.12 11设a=3,b=2,c=1,则表达式“a=b>c”的值() A. 0 B.1 C.2 D.3 二、填空每题5分 1.假设a,b,c都是整型,且值都为5,执行“a+=b+c++;”,则a,b,c, 结果分别为(15 5 6 ) 2、如果a为false, b为true,则a&&b为(发) 3、已知枚举类型定义语句为: Enum color( white,black=100, red,blue,green=300); Blue 的值为(102 ) 4、执行下列语句:“a=30;b=a++;c=++a;”,a,b,c值分别为(32 30 32 ) 5、已知“double x=2.5,y=4.7 int a=7;”那么表达式“x+a%3*(int)(x+y)%2/4的值(2.5 ) 三、编程题20分 输入三角形三边长,a,b,c,输出三角形面积;已知三角形三边长求面积公式为:

作业━━第1章━━运算符与表达式

运算符与表达式 【学习要点】 1.掌握运算符的目数、优先级、结合性等概念。 2.掌握算术运算及其应用。 3.掌握自增、自减运算及其应用。 4.掌握关系、逻辑运算及其应用。 5.掌握位运算及其应用。 6.掌握赋值、复合赋值运算及其应用,掌握赋值兼容时的类型转换。 7.掌握表达式求值时类型的自动转换和强制转换。 8.掌握表达式的组成,掌握逻辑表达式的优化及其副作用。 9.掌握逗号运算符、sizeof运算符、条件运算符及其应用。 ------------------------------------------------------------------------------------------------------------------------------------------------- 【例题分析】 1.若int x,y,z;下列表达式中运算结果与x=y=24相同的是______。 A.x=(y=z=8,4*6) B.x=y=(z=8,4*6) C.x=y=z=8,4*6 D.x=(y=z=8),4*6 【答案】B 【解析】 ①C++语言的赋值运算有别于其它高级语言,逗号运算又是其它高级语言所没有的。 ②在赋值表达式中,可以有多个赋值运算符,计算顺序自右向左,运算优先级低,仅高于逗号运算符。 ③逗号既是分隔符,又是运算符,可以用一个逗号运算符或多个逗号运算符将多个表达式连接成逗号表达式,计算顺序自左向右,并将最后一个表达式的值作为整个逗号表达式的值,逗号运算优先级最低。 2.若int i=6,k=0;下列表达式中运算结果使k=7的是______。 A.k=i+++k B.k=k+i++ C.k=++i+k D.k=k+++i 【答案】C 【解析】 ①自增++、自减--运算符是C++语言特有的。 ②运算符++、--出现在变量的前面或后面,其运算结果是不同的。若++、--出现在变量前,则先将变量的值加1(或减1)后,再将变量的值参加运算;反之则先将变量的值参加运算,再将变量的值加1(或减1)。 ③自增、自减运算符的优先级高于算术运算符,因此对于k=i+++k:解释为i++,再加k;对于k=k+++i:解释为k++,再加i。 3.表达式‘A’+’B’+20的值是______。 【答案】151 【解析】不同类型的数据混合运算时,系统可以自动进行类型转换,将表示范围小的数据类型转换成另一操作数的相同类型后再参与运算,则转换为65+66+20=151。 4.若int e=8;double f=6.4,g=8.9;则f+int(e/3*int(f+g)/2)%4的值是______。 【答案】9.4 【解析】 ①不同类型的数据混合运算时,可以使用强制类型转换符,将一种数据类型强制转换成另一种数据类型后再参与

第三章数据类型、运算符和表达式

设x的值为4,则表达式y=(++x)+(++x)+(++x)后,y的值是(D)。 A.12 B.18 C.16 D.21 下列数据中,为字符的是(D)。 A.‘AB’ B."A" C.How D.‘A' 以下符号中,合法的用户标识符是(D)。 A. -p B. int C. 3ab D. _xt_ 以下实型常量中,符合C语言语法的是(A)。 A. .5E-3 B. 1.2E0.5 C. E15 D. 3.14.159E 若有说明和语句:int a=5,b=6;b*=a+1;则b的值为(D) A. 5 B. 6 C. 31 D. 36 设C 语言中,int 类型数据占4个字节,则short 类型数据占(C)。 A.1个字节 B.2个字节 C.4个字节 D.8个字节 若x=3.5,a=2,y=2.5,b=3则表达式(float)(a+b)/2+(int)x%(int)y的值是()。A.1.5 B.2.5 C.3.5 D.2 以下选项中不属于C语言的类型的是(D)。 A.signed short int

B.unsigned long int C.unsigned int D.long short 关于C语言数据类型的叙述,正确的是(C)。 A. 整型不是基本类型 B. 数组不是构造类型 C. 变量必须先定义后使用 D. 不允许使用空类型 若a=12,则表达式a-=a的值为(A)。 A. 0 B.12 C.1 D. 24 若x=3.5,a=2,y=2.5,b=3则表达式(int)(a+b)/2+(int)x%(int)y的值是(D)。 A. 1.5 B. 2.5 C. 3 D. 3.5 若a是数值类型,则逻辑表达式(a==1)&&(a!=1)的值是(C)。 A.1 B. 2 C. 0 D. 不知道a的值,不能确定 若char x=97,则变量x对应(A)字符。 A. ‘a’ B. ‘A’ C. ‘9’ D. ‘7’ 设C语言中,int类型数据占2个字节,则float类型数据占(C)字节。 A. 1个 B. 2个 C. 4个 D. 8个 下列数据类型不是C语言基本数据类型的是(C)。 A. 字符型 B. 整型 C. 数组

第三章-关系代数与关系运算复习课程

第三章关系代数与关系运算 关系数据语言有三类: 1.关系代数语言 2.关系演算语言(元组关系演算语言、域关系演算语言) 3.具有关系代数和关系演算双重特点的语言如SQL 一.关系代数 关系代数:一种抽象的查询语言,是关系数据操纵语言的一种传统表达方式。用对关系的运算来表达查询。 运算:将一定的运算符作用于一定的运算对象上,得到预期的运算结果 运算三要素:运算符、运算对象、运算结果 关系代数的运算对象和结果都是:关系 关系代数运算符(四类):集合运算符、专门的关系运算符、算术比较符和逻辑运算符 集合运算符:并(U)、差(—)、交(∩) 传统的集合运算符——从关系的“水平“方向即行的角度来进行 专门的关系运算符:广义笛卡尔积(ⅹ)、选择(σ)、投影(π)、连接、除 专门关系运算符不仅涉及行而且涉及列 比较运算符:>、<、=、≥、≤、≠ 逻辑运算符:¬∧∨ 用来辅助专门的关系运算符 二.传统的集合运算符

传统集合运算符是二目运算符 设关系R和S具有相同的目n(即n个属性),且相应的属性取自同一个域 1.并(Union) 记作:RUS={t|t∈R∨t∈S}结果仍是n目关系,由属于R或S的元组组成。 例: (a)(b) (c)(d) (e) 2.差 关系R与S的差记作:R-S={t|t∈R∧t∈S} 结果仍是n目,由属于R而不属于S的所有元组组成。如图E 3.交 关系R与S的交记作:R∩S = { t | t∈R∧t∈S }结果仍是n目,由即属于R又属于S 的所有元组组成。如图D 可以用差来表示R∩S=R-(R-S) 4.广义笛卡尔积 两个分别为n目和m目的关系R和S的广义笛卡尔积是一个(m+n)列的元组的集合。元组的前n列是关系R的一个元组,后m列是关系S的一个元组。若R有k1个元组,S 有k2个元组,那么关系R与S的广义笛卡尔积有k1 x k2个元组,记作 R×S = { t r t s | t r∈R∧t s∈S } 结果是m+n目 如图例

实验3:运算符与表达式

实验3:运算符与表达式 实验名称:运算符与表达式成绩: 实验日期:年月日实验报告日期:年月日 一、实验目的 1、掌握C语言算术、赋值、自增、自减运算符及相应表达式 2、掌握不同类型数据之间的赋值规律 3、了解强制数据类型转换以及运算符的优先级、结合性。 4、学会根据表达式,编写相应程序,验证表达式结果的方法。 二、实验内容 1、已知:a=2,b=3,x=3.9,y=2.3(a,b整型,x,y浮点),计算算术表达式(float)(a+b)/2+(int)x%(int)y 的值。试编程上机验证。 提示编程要点: (1)先判断结果值类型,可设置一个此类型的变量用于记录表达式结果,本例用r存放结果; (2)程序先给几个条件变量赋初值,然后将表达式赋值给变量r; (3)最后打印变量r的值就是表达式的值。 您分析的表达式结果:。 2、已知:a=7,x=2.5,y=4.7(a整型,x,y浮点),计算算术表达式x+a%3*(int)(x+y)%2/4的 值。试编程上机验证。 您分析的表达式结果:。 3、已知:a=12,n=5(a,n整型),计算下面表达式运算后a的值。试编程上机验证。 (1)a+=a (2)a-=2 (3)a*=2+3 (4)a/=a+a (5)a%=(n%=2) (6)a+=a-=a*=a

您分析的表达式结果:(1) (2) (3) (4) (5) (6) 。 4、分析下面程序结果,并上机验证。 main() { int i,j,m,n; i=8; j=10; m=++i; n=j++; printf("i=%d, j=%d, m=%d, i=%d\n",i,j,m,n); } 您分析的表达式结果:。 5、将k分别设置为127,-128,128,-129,分析下面程序结果,并上机验证。 main() { float a=3.7,b; int i,j=5; int k=127; /* 用127,-128,128,-129测试*/ unsigned U; long L; char C; i=a; printf("%d\n",i); /* 浮点赋值给整型*/ b=j; printf("%f\n",b); /* 整型赋值给浮点*/ U=k; printf("%d,%u\n",U,U); /* 相同长度类型之间赋值*/ L=k; printf("%ld\n",L); /* 整型赋值给长整型,短的类型赋值给长的类型*/ C=k; printf("%d\n",C); /* 整型赋值给字符型,长的类型赋值给短的类型*/ } 您分析的表达式结果:

第三章 运算符与表达式

第三章运算符与表达式 3、1 C运算符简介 运算符:狭义的运算符是表示各种运算的符号。 表达式:使用运算符将常量、变量、函数连接起来,构成表达式。 C语言运算符丰富,范围很宽,把除了控制语句和输入/输出以外的几乎所有的基本操作都作为运算符处理,所以C语言运算符可以看作是操作符。C语言丰富的运算符构成C语言丰富的表达式(是运算符就可以构成表达式)。运算符丰富、表达式丰富、灵活。 在C语言中除了提供一般高级语言的算术、关系、逻辑运算符外,还提供赋值符运算符,位操作运算符、自增自减运算符等等。甚至数组下标,函数调用都作为运算符。 C的运算符有以下几类: ++,-- 本章主要介绍算术运算符(包括自增自减运算符)、赋值运算符、逗号运算符,其它运算符在以后相关章节中结合有关内容陆续进行介绍。 3、2 算术运算符和算术表达式

1、算术运算符 +(加法运算符。如3+5) -(减法运算符或负值运算符。如5-2,-3) *(乘法运算符。如3*5) /(除法运算符。如5/3,5.0/3) %(模运算符或求余运算符,%要求两侧均为整型数据。如7%4的值为3)。 除了负值运算符-单目运算符外,其它都是双目运算符。 说明: (1)两个整数相除的结果为整数,如5/3的结果为1,舍去小数部分。但是如果除数或被除数中有一个为负值,则舍入的方向是不固定的,多数机器采用“向0取整”的方法(实际上就是舍去小数部分,注意:不是四舍五入)。 (2)如果参加+,-,*,/运算的两个数有一个为实数,则结果为double型,因为所有实数都按double型进行计算。 (3)求余运算符%,要求两个操作数均为整型,结果为两数相除所得的余数。求余也称为求模。一般情况,余数的符号与被除数符号相同。 例如:-8%5=-3;8%-5=3 2、算术表达式 算术表达式:用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为算术表达式。运算对象可以是常量、变量、函数等。 例如,下面是一个合法的C算术表达式。a*b/c-1.5+’a’。

相关文档
最新文档