当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
2015年计算机二级C语言精编教程第二章(6)
发布时间:2011/2/28 16:43:19 来源:城市学习网 编辑:ziteng

  2.6 赋值表达式

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

  在C语言中,赋值号“=”是一个运算符,称为赋值运算符。由赋值运算符组成的表达式称为赋值表达式,其形式如下:

  变量名=表达式

  赋值号的左边必须是一个代表某一存储单元的变量名,对于初学者来说.只要记住赋值号左边必须是变量名即可。赋值号的右边必须是C语言中合法的表达式。赋值运算的功能是先求出右边表达式的值,然后把此值赋给赋值号左边的变量,确切地说,是把数据存入以该变量为标识的存储单元中去。例如,a和b都被定义成int类型变量:

  a=10; /*把常量l0赋给变量a*/

  b=a; /*把a中的值赋给变量b,a中的值不变*/

  在程序中可以多次给一个变量赋值,每赋一次值,与它相应的存储单元中的数据就被更新一次,内存中当前的数据就是最后一次所赋的那个数据。

  说明:

  (1)赋值运算符的优先级别只高于逗号运算符,比任何其他运算符的优先级都低,且具有自右向左的结合性。因此,对于如下的表达式:

  a=2+7/3

  由于所有其他运算符的优先级都比赋值运算符高,所以先计算赋值运算符右边表达式的值,再把此值赋给变量a。(2)赋值运算符不同于数学中的“等于号”,这里不是等同的关系,而是进行“赋予”的操作。

  (3)赋值表达式x=y的作用是,将变量y所代表的存储单元中的内容赋给变量x所代表的存储单元。x中原有的数据被替换掉。赋值后,变量y中的内容保持不变。此表达式应当读作“把右边变量的值赋给左边变量”,而不应读作“x等于y”。

  (4)在赋值表达式x=x中,虽然赋值运算符两边的运算对象都是x,但出现在赋值号左边和右边的x具有不同的含义。赋值号右边的x表示变量x所代表的存储单元中的值。赋值号左边的x代表以x为标识的存储单元。该表达式的含义是取变量x中的值放到变量x中去。当然,这一操作并无实际意义。

  表达式n=n+1也是合法的赋值表达式,其作用是取变量n中的值加1后再放回到变量n中,即使变量n中的值增1。

  (5)赋值运算符的左侧只能是变量,不能是常量或表达式。a+b=c就是非法的赋值表达式。

  (6)等号右边的表达式也可以是一个赋值表达式。如a=b=7+1,按照运算符的优先级,将首先计算出7+1的值8,然后按照赋值运算符自右向左的结合性,把8赋给变量b,最后再把变量b的值赋给变量a。而表达式a=7+1=b则是不合法的,因为在7+1=b中,在赋值号的左边不是一个变量。

  (7)在C语言中,“=”号被视为一个运算符,a=19是一个表达式,而表达式应该有一个值,C语言规定最左边变量中所得到的新值就是赋值表达式的值。

  (8)C语言的赋值表达式可以作为语句中的某个成分出现在众多的语句或表达式中,从而使变量中的数值变化过程变得难于掌握。因此要求读者在学习过程中建立正确的概念,才能准确掌握赋值表达式的运算规律。 [NextPage]

  2.6.2 复合赋值表达式

  在赋值运算符之前加上其他运算符可以构成复合赋值运算符。C语言规定可以使用10种复合赋值运算符,其中与算术运算有关的复合赋值运算符有:+=、-=、*=、/=、%=(注意:两个符号之间不可以有空格)。复合赋值运算符的优先级与赋值运算符的优先级相同。表达式n+=1的运算规则等价于n=n+1,表达式n*=m+3的运算规则等价于n=n*(m+3),因为运算符“+”的优先级高于复合赋值运算符“*=”。其他以此类推。

  例2.3 已有变量a,其值为9,计算表达式a+=a-=a+a的值。

  因为赋值运算符与复合赋值运算符“-=”和“+=”的优先级相同,且运算方向自右至左,所以:

  (1)先计算“a+a”;因a的初值为9,所以该表达式的值为18,注意a的值求变。

  (2)再计算“a-=18”,此式相当于“a=a-18”,因a的值仍为9,所以表达式的值为-9,注意a的值已为-9。

  (3)最后计算“a+=-9”,此式相当于“a=a+(-9)”,因a的值此时已是-9,所以表达式的值为-18。

  由此可知,表达式a+=a-=a+a的值是-18。

  2.6.3 赋值运算中的类型转换

  在赋值运算中,只有在赋值号右侧表达式的类型与左侧变觅类型完全一致时,赋值操作才能进行。如果赋值运算符两侧的数据类型不一致,在赋值前,系统将自动先把右侧表达式求得的数值按赋值号左边变量的类型进行转换,也可以用强制类型转换的方式人为地进行转换后将值赋给赋值号左边的变量。这种转换仅限于数值数据之间,通常称为“赋值兼容”。对于另外一些数据,例如后面将要讨论的地址值就不能斌给一般的变量,称为“赋值不兼容”。

  在这里,特别需要指出的是在进行混合运算时整型数据类型之间的转换问题。

  在C语言的表达式(不包括赋值表达式)中,如果运算符两边的整数类型不相同,将进行类型之间的转换。转换规则如下:

  (1)若运算符两边一个是短整型,一个是长整型,则将短整型转换为长整型,然后进行运算。

  (2)若运算符两边一个是有符号整型,一个是无符号整型;则将有符号整型转换成无符号整形,然后进行运算。

  在C语言的赋值表达式中,赋值号右边的值先转换成与赋值号左边的变量相同的类型,然后进行赋值。应当注意:

  (1)当赋值号左边的变量为短整型,右边的值为长整型时,短整型变量只能接受长整型数低位上两个字节中的数据,高位上两个字节中的数据将丢失。也就是说,右边的值不能超出短整型的数值范围,否则将得不到预期的结果。例如,若有以下定义和语句:

  short a;

  unsigned long b;

  b=98304; a=b;

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

  则a中的值为-32768。因为98304(二进制数11000000000000000)已经超出短整型的数值范围(-32768~32767),a截取b中低16位中的值(二进制数1000000000000000),由于最高位为1,因此。中的值为-32768。

  (2)当赋值号左边的变量为无符号整型,右边的值为有符号整型时,则把内存中的内容原样复制。右边数值的范围不应超出左边变量可以接受的数值范围。同时器要注意,这时负数将转换为正数。例如,变量。被说明为unsigned类型,在进行了a=-1的赋值操作后,将使a中的值为65535。

  (3)当赋值号左边的变量为有符号整型,右边一的值为无符号整型时,复制的机制同上。这时若符号位为1,将按负数处理。

 

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved