程序员的知识教程库

网站首页 > 教程分享 正文

24小时学会C语言:第三讲(c语言入门教程视频)

henian88 2024-09-10 14:21:50 教程分享 6 ℃ 0 评论

第3小时 运算符和表达式

C语言的运算符范围很宽,把除了控制语句和输出输入语句以外的几乎所有的基本操作都作为运算符进行处理,如“=”作为赋值运算符,方括号作为下标运算符。C的运算符有下列几类:算术运算符(+ -  * / %);赋值运算符(=);逗号运算符(,);关系运算符(==  >= <= !=);逻辑运算符(! && ||);位运算符(>> &等);条件运算符(? :);指针运算符(* &);求字节运算符(sizeof);强制类型换运算符((类型));分量运算符(. >);下标运算符([])及其它。在这里我们介绍前五种运算符。用运算符和括号将运算对象连接起来的,符合C语法规则的式子,成为C表达式。

本章导读:1.掌握C语言基本的运算符性质

2.熟悉表达式的运算方式和结合性质

3.复习第一小时中的上级步骤

4.掌握运算符的优先级.

3.1算术运算符和表达式

C 语言分别用 +,-,* ,/ 表示四则运算的加、减、乘、除运算符。%是模运算符或称求余运算符,它的两端均应为整数部分,如7%4的值是3.需要说明的是,两个整数的除法的结果是整数,如5/3的结果为1,略去小数部分。但是除数或被除数中有一个是负数则舍入的方向会不同,如-5/3在有的机器上的结果是-1,有的机器上是-2。多数机器采用“向零取整”的方法。

用算术运算符和括号将运算对象连接起来的符合C语法规则的式子,称为C算术表达式。

例如:a*b/c-1.5+'a'。

如果在运算中有一个数为实数,则结果是double型的,因为所有的实数都按double进行运算。相关的程序代码在:光盘的progrom\第三小时下。

例: void main()

{ printf("\n\n%d,\n",20/7,-20/7);

printf("%f,%f\n",20.0/7,-20.0/7);

}

利用前面使用的方法把上面的程序写进TC环境中并保存,如图3.1所示。

图3.1 输入环境中

语句printf中%d和后面的输出结果是相对应的,这一点会在结果中体现。下面对程序进行编译和链接,并运行的结果。如图3.2所示。

图3.2 运行结果

3.2赋值运算符和表达式

赋值符号“=” 赋值运算符,它的作用是讲一个数据赋予另一个变量,也可以是将一个表达式的赋予一个常量。如“a=3”的作用是把常数3赋予常量a。

C语言中有复合的赋值语句,就是在“=”之前加上其他的运算符。常见的有+=,-=,*=,/=,%=等。应用符合运算符可以简化程序,同时也可以编译效率。

用赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。赋值表达式的一般形式是:<变量><赋值运算符><表达式>,(表达式也可以是赋值表达式)。

看几个表达式:a=b=c=5 (它的表达式为5,a,b,c值均为5)

a=5+(b=4) (表达式为11,a的值是11,b的值是4)

a=(b=10)/(c=2) (表达式为5,a 值为5,b值为10,c值为2)

赋值表达式中包含有复合的赋值运算符的情况,如a+=a-=a*a, 假设 a的初值是12,它的分开形式相当于(1) a-=a*a即a=a-a*a,a的值为-132,(2)a+=-132,即a=a+(-132),a的值为-264。

如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下:

1)实型赋予整型,舍去小数部分。前面的例子已经说明了这种情况。

2)整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为0)。

3)将一个double型数据赋予float型变量时,截取其前7位有效数值,存放在float变量的存储单元(32位)中。但应注意数值范围不可以溢出。

4) 字符型赋予整型,由于字符型为一个字节,而整型为二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。整型赋予字符型,只把低八位赋予字符量。相关的程序代码在:光盘的progrom\第三小时下。

main()

{

int a,b=322;

float x,y=8.88;

char c1='k',c2;

a=y;

x=b;

a=c1;

c2=b;

printf("%d,%f,%d,%c",a,x,a,c2); }

在TC中的显示如图3.3所示。

图3.3输入环境中

本例表明了上述赋值运算中类型转换的规则。

(1)a为整型,赋予实型量y值8.88后只取整数8。

(2)x为实型,赋予整型量b值322, 后增加了小数部分。

(3)字符型量c1赋予a变为整型。

(4)整型量b赋予c2 后取其低八位成为字符型(b的低八位为01000010,即十进制66,按ASCII码对应于字符B)。

结果如图3.4所示。

图3.4 运行结果

3.3逗号运算符和表达式

逗号运算符是C语言提供的一种特殊的运算符,用它将两个表达式连接起来。如:4+3,5=6,称为逗号表达式,也称为“顺序求职运算符”它的表达式的一般形式为“表达式1,表达式2”,执行顺序是先进行表达式1,而后进行表达式2。整个逗号表达式的结果是表达式2的值。表达式可以扩展为“表达式1,表达式2,表达式3......表达式n”

观看下面的例子:相关的程序代码在:光盘的progrom\第三小时下。

main()

{ int a,b,x,y;

x=(a=3,6*3);

y=a=3,6*a;

printf("%d,%d,%d,%d",a,b,x,y);}

把上面的程序写进TC环境中,从命名为SP3_2.C ,如图3.5所示。

图3.5程序输入完毕

图3.3中第一处有下划线的说明整个逗号表达式的结果是最后一个表达式的值。第二处有下划线的说明并不是任何地方出现的逗号都是作为逗号运算符。第三处关键是与第二处进行对比 。当编译和链接正常时,就可以进行运行。如图3.6所示。

图3.6 运行结果

由运行结果可见x的取的是后面的3 *6=18,而printf中的逗号并不是全是逗号运算符,应看情况而定。严格地讲这个例子中用到了C语言中语句的含义。语句的含义将在后面的内容中讲到。

3.4关系运算符和表达式

C语言中提供的关系运算符有六种:>,<,>=,<=,==,!=。前四种关系运算符的级别相同,后面两种关系运算符的级别相同。且前四种的优先级高与两种。用关系运算符将两个表达式(算术运算表达式,赋值运算表达式,逗号运算表达式,关系运算表达式)相连的式子,称为关系表达式。

在C语言中关系表达式的值是一个逻辑值,非真即假。例如:“5==3”的值为“假”,“5>=3”的值为“真”。C语言中没有逻辑性数据,故而以“1”代表“真”,以“0”代表“假”。

假如设a=3,b=2,c=1,则:

关系表达式“a>b”的值为“真”,表达式的值为“1”。

关系表达式“(a>b)==c”的值为“真”,(因为a>b的值为1,等于c的值)表达式的值为“1”。

关系表达式“b+c<a”的值为“假”,表达式的值为“0”。

d=a>b d的值为1。

f=a>b>c f的值为0(因为“a>b”的运算符是自左至右的结合方向,先执行的值为1,再执行“1>c”,的值为0,把它赋予f)。

3.5 各类数值型数据之间的混合运算

前面讲到整形和实型可以混合运算,字符型数据可以同整型通用,故而整形,实型及字符型之间是可以混口运算的。在进行变量的运算中变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。

自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:

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

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

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

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

5) 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。

一般转换的方向如下:

float → double ← long ← unsigned ← int ← char,short

高 底

下图表示了类型自动转换的规则。相关的程序代码在:光盘的progrom\第三小时下。

main(){

float PI=3.14159;

int s,r=5;

s=r*r*PI;

printf("s=%d\n",s);}

在TC环境中如图3.7所示。

图3.7 程序解析

下面看它的运行结果如图3.8所示。

图3.8运行结果

强制类型转换是通过类型转换运算来实现的。其一般形式为;

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

其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。

(float) a 把a转换为实型

(int)(x+y) 把x+y的结果转换为整型

在使用强制转换时应注意以下问题:

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

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

main(){

float f=5.75;

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

}

在TC环境中如图3.9所示。

图3.9 程序输入完毕

下面看它的运行结果如图3.10所示。

图3.10 运行结果

3.6自增自减运算符

自增,自减运算符:自增1运算符记为“++”,其功能是使变量的值自增1。

自减1运算符记为“--”,其功能是使变量值自减1。

自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式:

++i i自增1后再参与其它运算。

--i i自减1后再参与其它运算。

i++ i参与运算后,i的值再自增1。

i-- i参与运算后,i的值再自减1。

在理解和使用上容易出错的是i++和i--。 特别是当它们出在较复杂的表达式或语句中时,常常难于弄清,因此应仔细分析。相关的程序代码在:光盘的progrom\第三小时下。

main(){

int i=8;

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

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

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

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

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

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

}

在TC环境中如图3.11所示。

图3.11 TC中运行

它的运行结果如图3.12所示。

图3.12 运行结果

main(){

int i=5,j=5,p,q;

p=(i++)+(i++)+(i++);

q=(++j)+(++j)+(++j);

printf("%d,%d,%d,%d",p,q,i,j);

}

在TC环境中如图3.13所示。相关的程序代码在:光盘的progrom\第三小时下。

图3.13 TC中运行

它的运行结果如图3.14所示。

图3.14 运行结果

3.7逻辑运算符和表达式

c语言中提供了三种逻辑运算符:

1) && 与运算 (相当于其他语言的AND)

2) || 或运算 (相当于其他语言的OR)

3) ! 非运算 (相当于其他语言的NOT)

表一显示逻辑运算符的真值表:

a

b

!a

!b

a&&b

a||b

表一 逻辑运算符真值表

逻辑表达式的一般形式为:(表达式 逻辑运算符 表达式)。其中的表达式又可以是逻辑

表达式,从而构成嵌套形式。运算符&&和或运算符||均为双目运算符。具有左结合性。非运算符!为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下:

!(非)→&&(与)→||(或)

按照运算符的优先顺序可以得出:

a>b && c>d 等价于 (a>b)&&(c>d)

!b==c||d<a 等价于 ((!b)==c)||(d<a)

a+b>c&&x+y<b 等价于 ((a+b)>c)&&((x+y)<b)

逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。其求值规则如下:

1. 与运算 &&:参与运算的两个量都为真时,结果才为真,否则为假。

如:5>0 && 4>2,由于5>0为真,4>2也为真,相与的结果也为真。

2或运算||:参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。如:5>0||5>8,由于5>0为真,相或的结果也就为真,而后面的5>8不执行。只有前项为假时,才对后项执行。

3.非运算!:参与运算量为真时,结果为假;参与运算量为假时,结果为真。如!(5>0)的结果为假。

注意:在C编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。 但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”即将非零得值认为是真。例如:由于5和3均为非“0”因此5&&3的值为“真”,即为1;5||0的值为“真”,即为1。

逻辑运算表达式的值应该是一个逻辑量“真”或者“假”。下面看个例子,相关的程序代码在:光盘的progrom\第三小时下。

main()

{

char c='k';

int i=1,j=2,k=3;

float x=3e+5,y=0.85;

printf("%d,%d\n",!x*!y,!!!x);

printf("%d,%d\n",x||i&&j-3,i<j&&x<y);

printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);

}

在TC环境中输入如图3.15所示。

图3.15 TC中运行

它的运行结果如图3.16所示。

图3.16 运行结果

3.8运算符的优先级及结合方向

在程序运行的过程中,就像在数学的运算中,有先后的优先级和结合方向。下面将要介绍上面与介绍过的运算符的优先级和结合方向。在表二中显示了他们的性质:

表二 运算符的优先级及结合方向

优先级

运算符

含义

运算对象个数

结合方向

1

++

――

逻辑非运算符

自增运算符

自减运算符

1

(单目运算符)

右→左

2

*

%

乘法运算符

除法运算符

求余运算符

2

(双目运算符)

左→右

3

加法运算符

减法运算符

2

(双目运算符)

左→右

4

< > <=

>=

关系运算符

2

(双目运算符)

左→右

5

&&

逻辑与运算符

2

(双目运算符)

左→右

6

||

逻辑或运算符

2

(双目运算符)

左→右

7

= += -=

≥= ≤=

赋值运算符

2

(双目运算符)

右→左

8

逗号运算符


左→右

(1)同一优先级的运算符,运算次序又结合方向决定。

(2)本表并没有介绍所有的运算符,日后再遇到是应先了解它们的优先级。

3.9本小时总结

本小时主要讲解了C语言中基本的运算符,通过例题了解了它们的用法和性质。它们在以后的学习中将会有很大的作用。同时它们之间的优先级也是相当关键的,特别别是对于初接触它的人。

3.10实战练习

(1)写出下面程序运行的结果并上机进行验证:

main()

{ int i,j,m,n;

i= 8,j=10;

m=++i;

n=j++;

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

}

(2) 求下面表达式的值:

x+a%3(int)(x+y)%2/4;

(设 x=2.5,a=7,y=4.7)

(float)(a+b)/2+(int)x%(int)y。

(设 a=3,b=3,x=3.5,y=2.5)

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表