3.3 赋值运算符和赋值表达式
考点7 赋值运算符和赋值表达式
真考链接
考点7 属于重点掌握重点理解的知识点。在选择题中的考核概率为40%。在操作题中,也是经常考到,考核概率为90%,需要注意的是将赋值运算符“=”与关系运算符“==”区分开。
在C语言中,“=”称做赋值运算符,作用是将一个数值赋给一个变量或将一个变量的值赋给另一个变量,由赋值运算符组成的表达式称为赋值表达式。
其一般形式为:变量名=表达式
在程序中可以多次给一个变量赋值,每赋一次值,与该变量相应的存储单元中的数据就被更新一次,内存中当前的数据就是最后一次所赋值的那个数据。
注意:
(1)赋值运算符的优先级别高于逗号运算符。
(2)注意赋值运算符“=”和等于运算符“==”的差别。
(3)赋值运算符的左侧只能是变量,而不能是常量或者表达式。右侧可以是表达式,包括赋值表达式,请注意“a=b=1+1”与“a=1+1=b”的差别,前者是正确的,可以根据结合方向得到结果,而后者是错误的,因为从右开始结合起的第一个赋值表达式的左侧是常数,所以是错误的。
(4)C语言规定最左边变量所得到的新值就是整个赋值表达式的值。
真题精选
【例1】若变量已正确定义并赋值,以下符合C语言语法的表达式是( )。
A.a:=b+1 B.a=b=c+2 C.int18.5%3 D.a=a+7=c+b
【答案】 B
【解析】选项A中包含一个不合法的运算符“:=”,选项C应改为(int)18.5%3;选项D可理解为两个表达式:a+7=c+b和a=a+7,其中第一个是错误的,因为C语言规定赋值号的左边只能是单个变量,不能是表达式或常量等。因此,正确答案是选项B,它实际上相当于a=(b=c+2),进而可分解为两个表达式:b=c+2和a=b。
【例2】若下列变量都已正确定义并赋值,则符合C语言语法的表达式是( )。
A.a=a+7; B.a=7+b+c,a++ C.int(12.3/4) D.a=a+7=c+b
【答案】 B
【解析】选项A中“a=a+7;”赋值表达式的最后有一个分号“;”,C语言规定,语句用分号结束,所以“a=a+7;”是一条赋值语句,而不是表达式。
【例3】下列给定程序中函数fun()的功能是:计算并输出high以内最大的10个素数的和。high的值由主函数传给fun()函数。
例如,若high的值为100,则函数的值为732。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序
#include <conio.h>
#include <stdio.h>
#include <math.h>
int fun(int high)
{ int sum=0,n=0,j,yes;
/*****found*****/
while((high> =2)&&(n<10)
{ yes=1;
for(j=2;j< =high/2;j++)
if(high% j==0)
{ /*****found*****/
yes=0;break
}
if(yes)
{ sum+ =high;
n++;
}
high--;
}
return sum;
}
main()
{ printf("% d\n",fun(100));
}
【答案】(1)while((high>=2)&&(n<10))
(2)yes=0;break;
【解析】本题考查:C语言程序的语法格式。
一处是while循环条件丢掉一个括号;另一处是很简单的程序语法错误,没有加分号。
考点8 复合的赋值运算符
真考链接
考点8讲解的是构成算法的基本元素。虽然不会以单独的考题来进行考查,但无论是在选择题或操作题中,都会在题目中穿插这些知识点。
选择题中对此知识点的考核概率为80%。
在赋值运算符之前加上其他运算符可以构成复合赋值运算符。其中与算术运算有关的复合运算符有+=、-=、*=、/=和%=等。
两个符号之间不可以有空格,复合赋值运算符的优先级与赋值运算符的相同。表达式n+=1等价于n=n+1,作用是取变量n中的值增1再赋给变量n,其他复合的赋值运算符的运算规则依此类推。
如求表达a+=a-=a*a的值,其中a的初值为12。
具体计算步骤是:
(1)先进行“a-=a*a”运算,相当于a=a-a*a=12-144= -132。
(2)再进行“a+=-132”运算,相当于a=a+(-132)=-132-132=-264。
小提示
复合运算符“a+=b”指的运算规则为a=a+b。
常见问题
在程序中定义y为整型变量,若给其赋值为6.33,则y的值是什么?
如果赋值运算符两侧的类型不一致,在赋值前系统将自动先把右侧的值或通过表达式求得的数值按赋值号左边变量的类型进行转换,所以y在程序中的值为6。
真题精选
【例1】设有定义:intx=2;,以下表达式中,值不为6的是( )。
A.x*=x+1 B.x++,2*x C.x*=(1+x) D.2*x,x+=2
【答案】 D
【解析】本题考查逗号运算符的运算方式,逗号运算符的作用是将若干表达式连接起来,它的优先级别在所有运算符中是最低的,结合方向为“自左向右”。A项和C项的结果是一样的,可展开为:x=x*(x+1)=2*3=6;B项中先执行x++,因为++运算符有自加功能,逗号之前执行后x的值为3,逗号后的值就是整个表达式的值,即6;D项逗号之前并未给x赋值,所以表达式的值就是x+=2的值,即4。因此,本题答案为D。
【例2】下列给定程序中函数fun()的功能是:将长整型数中各位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
例如,当s中的数为87653142时,t中的数为7531。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void fun(long s,long *t)
{ int d;
long s1=1;
*t=0;
while(s>0)
{ d=s% 10;
if(d% 2!=0)
{ *t=d*s1+*t;
s1【1】10;
}
}
s/=10;
}
void main()
{ long s,t;
printf("\nPlease enter s:");
scanf("% ld",&s);
fun(s,&t);
printf("The result is:% ld\n",t);
}
【答案】【1】:*=
【解析】本题考查:复合的赋值运算符 *=的使用。
考点9 强制类型转换运算符与赋值运算中的类型转换
1.强制类型转换运算符
可以利用强制类型转换运算符将一个表达式转换成所需类型,其一般形式为:
(类型名)(表达式)
例如:(char)(x+y);,将(x+y)的值强制转换为字符型。
(double)(m*n);,将(m*n)的值强制转换为double类型。
2.赋值运算中的类型转换
如果赋值运算符两侧的类型不一致,在赋值前系统将自动先把右侧表达式求得的数值按赋值号左边变量的类型进行转换(也可以用强制类型转换的方式),但这种转换仅限于某些数据之间,通常称为“赋值兼容”。对于另一些数据,如后面将要讨论的地址值,就不能赋给一般的变量,称为“赋值不兼容”。常用的转换规则如下。
真考链接
考点9 这个知识点在选择题中的考核概率为20%。
(1)当实型数据赋值给整型变量时,将实型数据的小数部分截断。
如intx;,执行“x=5.21;”后,x的值为5。
(2)当整型数据赋值给实型变量时,数值不变,但以浮点数形式存储到实型变量中。
如floatx=45;
输出x的结果为45.00000。
(3)当double类型数据赋值给float型变量时,取其前面7位有效数字,存放到float型变量的存储单元中,这时数值可能溢出。
(4)当字符型数据赋值给整型变量时,由于整型变量占两个字节,而字符只占一个字节,需将字符数据(8位)放到整型变量低8位中,对该整型变量最高位进行符号扩展,其他位补零。
(5)当整型、短整型、长整型数据赋值给一个char类型变量时,将其低8位原封不动地送到char类型变量中(即截断)。
常见问题
在程序中定义y为整型变量,但是给其赋值为6.33,则y的值是什么?
如果赋值运算符两侧的类型不一致,在赋值前系统将自动把右侧的值或通过表达式求得的数值按赋值号左边变量的类型进行转换,所以y在程序中的值为6。
真题精选
【例1】执行以下程序后的输出结果是( )。
main()
{ int a = 65;
printf("% c",(char)a);
}
A.A B.B C.C D.D
【答案】 A
【解析】A的ASCII码为65,int类型强制转换为char类型后输出A。
【例2】以下程序的运行结果是( )。
main()
{ char ch = 'A';
int num1 = ch;
float num2 = num1;
printf("% f",num2);
}
A.A B.65 C.65.00000 D.a
【答案】C
【解析】A的ASCII码为65,赋值语句num1 =ch把char类型的变量转换成int类型的变量num1;赋值语句num2=num1把类型为int的变量转换为类型为float的变量num2,最后printf打印出num2的值为65.00000。
【例3】若a为整型变量,则执行以下语句后的( )。
a= -2L;
printf("% d\n",a);
A.赋值不合法 B.输出值为-2 C.输出为不确定值 D.输出值为2
【答案】 B
【解析】本题的关键是要弄清楚C语言中常量的表示方法和有关的赋值规则。在一个整型常量后面加一个字母l或L,则认为是longint型常量。一个整型常量,如果其值在-32768~+32767范围内,可以赋给一个int型或longint型变量;但如果整型常量的值超出了上述范围,而在-2147483648~2147483647范围内,则应将其值赋给一个long int型变量。本例中-2L虽然为longint型变量,但是其值为-2,因此可以通过类型转换把长整型转换为短整型,然后赋给int型变量a,并按照%d格式输出该值。
【例4】已知字符A的ASCII码值是65,执行以下程序后的( )。
#include<stdio.h>
main()
{ char a= 'A';
int b=20;
printf("% d,% o",(a=a+1,a+b,b),a+ 'a'- 'A',b);
}
A.表达式非法,输出零或不确定值 B.因输出项过多,无输出或输出不确定值
C.输出结果为20,141 D.输出结果为20,1541,20
【答案】 C
【解析】首先应该注意到printf()函数有3个实参数:(a=a+1、a+b、b)、a+'a'-'A'和b,并没有问题,可见选项A错误。由于格式控制字符串“%d,%o”中有两个描述符项,而后面又有表达式,因此,必定会产生输出,选项B也是错误的。既然控制字符串中只有两个格式描述符,输出必然只有两个数据,故选项D错误。
【例5】给定程序的功能是:计算并输出下列级数的前n项之和Sn,直到Sn 大于q为止,q的值通过形参传入。
例如,若q的值为50.0,则函数值为50.416687。
注意:部分源程序给出如下。
请勿改动主函数main()和其他函数中的任何内容,仅在函数fun()的标号处填入你编写的若干表达式或语句。
试题程序
#include<stdio.h>
double fun(double q)
{ int n;
double s;
n=2;
s=2.0;
while(s【1】q){
s=s+【2】(n+1)/n;
【3】;
}
printf("n=% d\n",n);
return s;
}
main()
{ printf("% f\n",fun(50));
}
【答案】【1】 <= 【2】(double) 【3】n++或n+=1或n=n+1
【解析】本题考查:关系运算符;强制类型转换运算符;自加、自减运算符。
填空【1】:根据题意,相加直到Sn 大于q为止,因此为<=。
填空【2】:强制转换成浮点型。
填空【3】:变量n为增量,每循环一次,增加n的值。