2.3 赋值语句
赋值语句是程序中最经常出现的语句,它的作用是对一个变量进行赋值。赋值就是将一个数据存入一段连续的具有若干个存储单元的存储空间中,该存储空间有一个名字,就是前面介绍的变量名。程序中通过变量名来使用这些存储空间,既可以通过变量名将某个数据存入,又可以通过变量名将已存入的数据读出。对一个变量进行定义后,这个变量如果没有赋值,那么它的值是不确定的,所以对变量进行操作之前,应该对该变量进行赋值。
一、赋值语句的格式与功能
1、赋值语句的定义:
赋值语句是由赋值表达式和一个语句结束符(即分号“;”)组成的。
2、赋值语句的一般形式
变量 = 表达式 ;
说明:这种语句实际上就是在赋值表达式后面加上一个“=”。
(1)会发生类型转换 (2)右结合
(3)优先级倒数第二
3、赋值语句的功能(先计算后赋值)
它的功能是首先计算赋值号“=”右边表达式的值,然后将结果送给赋值号“=”左边的变量。
4、赋值语句的用法
例1 g=9.8;
说明:给变量直接赋值。g为变量名,“=”为赋值号。该语句表示将数据 9.8 赋给变量g。
例2 g=10+20-9;
说明:右边为表达式。执行该语句时,先计算右边表达式”10+20-9”的值,结果为21,再将21存入变量g中。
例3 int x=1; x = x+1;
说明:累加语句。上面有两条句,第一条定义一个变量x,并初始为1;第二条语句,则将x的值1取出,将1和1相加,再将结果2存入x中,即变量g的当前值为2。这与数学上的 表达式“x = x+1”不一样,需要加强理解。执行过程如下图所示:

对于初学者,需要注意的是,“=”不是等号,而是赋值号。赋值语句与算术中的等式是完全不同的。
注意:
虽然赋值号“=”是一个运算符,但由于它的操作是将右边表达式的值赋给左边的变量, 因此,要求赋值号“=”的左边一定是一个变量而不能是常量或表达式。例如
A=a+1;
3=x/2
a+b=12
都是错误的。
例2-3 定义两个字符型变量。
char c1, c2;
c1='a';
c2='b';
这个例子定义了两个字符型变量c1、c2,一个字符型变量可存放一个字符将一个字符量存放到一个字符变量中,实际上并不是把该字符常量本身放到内存中,而是将该字符相应ASCI码存放到内存单元中。C语言中的字符型数据与整型数据之间可以通用。因为字符型数据与整型数据的存储结构一样。
例2-4 给变量赋值。
#include <stdio.h>
main()
{ char c1='a', c2;
int k;
k=c1; //将字符型变量c1的ascii码赋给整型变量k
c2=97; //将整数97赋给字符型变量c2
printf("%c, %c, %d\n", c1, c2, c1);
//字符变量既可按字符型输出,也可按整型输出
printf("%d, %c\n", k, k);
//整型变量既可按整型输出,也可按字符型输出
}
运行结果如图2-2所示。

图2-2 例2-4运行结果
上面的程序中,变量说明:
char c1='a', c2;
等价于
char c1, c2 ;
即在定义变量的同时,可以给变量赋初值。
例2-5 将小写字母转换成大写字母。
源程序1:定义两个变量
#include <stdio.h>
main()
{ char c1, c2;
c1='a';
c2=c1-32; //c2='A'
printf("%c,%c",c1,c2);
}
运行结果如下图所示:

源程序2:定义一个变量
#include <stdio.h>
main()
{ char ch;
ch='a';
printf("%c=>", ch);
ch=ch-32; // 这种用法更多一些
printf("%c",ch);
}
运行结果如下:
知识点:
1、将大写字母转换为小写字母:ch = ch +32;
2、将小写字母转换为大写字母:ch = ch -32;
3、字母移位变换:
如:'b'-->'e' 相应语句 ch = ch +3;
'f' -->'b' 相应语句 ch = ch -4;
4、将数字字符转换对应的数值:
如:'1'-->1 相应语句 a = ch - '0';
5、将数字字符移位变换:
如:'1'-->'5' 相应语句 ch = ch -4;
注意:字符型数据做加减法运算时要有意义。
另外,由于C语言中还有一些复合赋值运算,如+=、-=、*=、 /=等,中间不能有空格,因此,下列语句:
c+=32; ( 相当于c=c+32; )
c-=32; ( 相当于c=c-32; )
i*=a+b; ( 相当于i=i*(a+b); )
k/=2; ( 相当于k=k/2; )
均为赋值语句,它们均可以作为一个单独的语句在程序中出现。
二、复合赋值运算
格式:复合赋值运算符=运算符+赋值号


三、赋值语句中的类型转换
当赋值语句(或赋值运算表达式)中“=”左边的变量与右边表达式的数据类型不一致时, C编译系统会自动实现数据类型的转换,转换的原则是将赋值号右边的表达式值的类型转换成与左边变量相同的类型后再赋值。例如:
int a;
short b;
char c;
a=b; //short型变量b的值转换成int型后再赋给a
b=c; //char型变量c的值转换成short型后再赋给b
a=b+c; //将b和c的值转换成int型后相加,再赋给a
需要注意的是,对于不同类型的变量,由于其数据的长度不同,当左边变量的数据类型比右边表达式值的类型长(比如int型转换成float型或 float型转换成 double型)时,转换后的值不会改变精度或准确度,只是改变值的表示形式。然而,当右边表达式值的类型比左边变量的类型要长时,这种转换的结果会对右边的数据进行截取,仅取出与左边变量类型相同的长度,这意味着会丢失高位数据,因此,可能引起精度降低或出现错误的结果。
总结:1、范围小->范围大,只改变存储结构
2、范围大->范围小,不但改变存储结构,精度可能降低或出现错误
看下面使用赋值语句编写的简单程序示例。
例2-6 使用赋值语句编写程序。
#include <stdio.h>
#include <conio.h>
main()
{
double x; int a =350; char c;
c=a; // int -> char 数据可能有错误
x=a; // int -> double 数据没有错误
printf("a=%d,c=%d,x=%f\n ", a, c, x);
getch( );
}
程序的运行结果如图2-3所示。

图2-3 例2-6运行结果
程序分析:
语句“c=a; ”执行如下图所示:

因为字符型在内存中仅占一个字节,所以执行“c=a”后,char型变量c只取int型变量a值的低8位。对于高位字节,数据则丢失。执行后,结果产生错误,c = 94。
语句“x=a;”执行如下图所示:

double型数据表示的范围比int型大,所以执行“x=a;“后,x的值不会比a小。数据的存储结构发生了变化,但数据的精度可能会发生变化。在编写程序时需要引起注意。
程序中 printf( )是格式化输出标准函数,它可将a、c、x的值按指定的格式显示在屏幕上, getch( )也是标准函数,等待用户输入任意一个字符。
一般来说,一个完整的计算机程序经常要求具备输入和输出功能。C语言本身没有配备完成输入/输出功能的语句,它的输入/输出功能是通过在程序中调用系统提供的标准函数来实现的。下面介绍几种常用的输入/输出(I/O)标准函数。
三、怎样编写源程序
1、写一个空程序

2、加头文件

3、定义变量

4、输入语句或初始化
5、算法

6、输出相关信息

一、赋值表达式
1、定义:由赋值运算符或复合赋值运算符将一个变量和一个表达式连接起来的表达式,称为赋值表达式。
2、赋值表达式的构成规则:
变量=表达式
变量 复合赋值运算符 表达式
其中,表达式可以是算术表达式、关系表达式、逻辑表达式、条件表达式、赋值表达式和逗号表达式等。由于逗号运算符的优先级低于赋值运算符,所以应注意加圆括号。
例: a=b=c=5 //表达式值为5,a,b,c值为5
a=(b=5) // b=5;a=5
a=5+(c=6) //表达式值11,c=6,a=11
a=(b=4)+(c=6) //表达式值10,a=10,b=4,c=6
a=(b=10)/(c=2) //表达式值5,a=5,b=10,c=2
二、自动类型转换
1、自动类型转换:
参与运算的各个数据都转换成数据较长的数据类型,然后计算,结果的类型就是数据长度较长的数据类型。本质上是较低类型的转换,即“ 就高不就低”或“就长不就短”的原则。
❖什么情况下发生
⚫ 运算转换------不同类型数据混合运算时
⚫ 赋值转换------把一个值赋给与其类型不同的变量时
⚫ 输出转换------输出时转换成指定的输出格式
⚫ 函数调用转换------实参与形参类型不一致时转换
❖运算转换规则:不同类型数据运算时先 自动转换成同一类型
先将运算结果的数据类型自动转换为左边变量的数据类型,然后再赋予该变量。本质上是“就左不就右”的转换原则。
例:设int a=1; float b=2.1; char c=’a’;
则表达式a=b+c的计算过程是先计算b+c,按照“ 就高不就低”的规则,将c转换为实型(变量c的值是97,转化为97.0),计算结果是实型,即99.1,由于变量a是整型,按照“ 就左不就右”的规则,所以将实型自动转换为整型赋予变量a,即99赋值给变量a。
除了自动类型转换和赋值类型转换外,C语言也允许强制类型转换。
数据类型强制转换的一般格式:(数据类型符)(表达式)
C语言首先按照自动类型转换原则计算表达式的值,然后将其转换为指定的数据类型。需要注意的是,若表达式仅仅是单个常量或变量时,外面的一对圆括号可以省略;若是含有运算符的表达式,则必须用一对圆括号括起来。
int a; float b=1.9; 执行语句 a=(int)b后变量a和b的值分别是 1,1.9
❖强制类型转换
❖一般形式: (类型名)(表达式) 强制类型转换运算符
例:
(int)(x+y)
(int)x+y
(double)(3/2)
(int)3.6
❖说明:强制转换得到所需类型的中间变量,原变量类型不变
❖精度损失问题
较高类型向较低类型转换时可能发生
2、数据类型转换图

3、进行数据类型转换时,需要注意以下几点:
1、强制类型转换获得的是一个所需类型的中间量,原来表达式的类型并不发生变化。
2、表达式计算过程中,参与运算的常量或变量的类型自动转换是临时的,它仅产生一个临时的、类型不同的数据参与运算,常量或变量的原类型和值均不改变。
3、运算结果赋予变量的类型转换过程中,无论是自动变量的还是强制的,当数据长度较长的结果存入数据长度较短的变量时,将截去超出的部分,有可能造成错误。
4、数据类型转换将占用系统时间,过多的转换将降低程序的运行效率,所以除了必要的数据类型转换外,应尽量选择好数据类型,避免不必要的转换。
【例】1、设int x=2, y=4;值为非0的表达式是( C )
A. 1/x*y B. 1/(x*y) C. 1.0/x/y D. 1/x/ (double)y
答案:C
解析:1/x*y中1、x和y都是整型,即在1整除x时,值为0,即1/x*y最终的值为0;1/(x*y)中1是整型常量,即在1整除x*y时,值为0;1.0/x/y中1.0表示1.0为实型,即在1.0整除x时,是可以保留小数的,即1.0/x/y最终的值为非0;1/x/ (double)y中1和x都是整型,即在1整除x时,值为0。
【例】2、设int a=1;float b=2.1;char c=‘a’;,则表达式a=b+c最后的类型为(A )
A. int B. float C. double D. char
答案:A
解析:表达式a=b+c的计算过程是先计算b+c,按照“就高不就低”的规则,将c转换为实型,c的值为97.0,计算结果为实型,即99.1,由于变量a是整型,按照“就左不就右”的规则,则表达式a=b+c最后的类型为int型。
【例】3、设char c1; , 则c1中为小写英文字母字符的正确表达式为( (c1>='a’)&&(c1<='z’) )
解析:逻辑符号“&&”是要同时满足左右两个表达式才为真,“||”是满足左右两个表达式中的一个就可以,小写字母的范围是从a到z,并且小写字母是字符,要用单引号括起来,即c1中为小写英文字母字符的正确表达式为(c1>='a’)&&(c1<='z’)