赋值运算符和赋值表达式

赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“a=3”的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a。也可以将一个表达式的值赋给一个变量。

赋值过程中的类型转换

如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时自动进行类型转换。

  1. 将浮点型数据(包括单、双精度)赋给整型变量时,舍弃其小数部分。如i为整型变量,执行“i = 3.56”的结果是使i的值为3,在内存中以整数形式存储。

  2. 将整型数据赋给浮点型变量时,数值不变,但以指数形式存储到变量中。如要执行“f = 23”,将23赋给float型变量f,按单精度指数形式存储在f中。如要执行“d = 23”,即将23赋给double型变量d,则将23以双精度指数形式存储到d中。

  3. 将一个double型数据赋给float变量时,要注意数值范围不能溢出。例如:

1
2
3
float f;
double d=123.456789e100;
f=d;

就会出现溢出的错误,因为超过了float型的数据范围。

  1. 字符型数据赋给整型变量,将字符的ASCII码赋给整型变量。

  2. 将一个int,short或long型数据赋给一个char型变量,只将其低8位原封不动地送到char型变量(发生截断)。例如:

1
2
3
short int i=289;
car c;
c = i; //将一个int型数据赋给一个char型变量

赋值情况为下图所示:

赋值情况

在变量c的存储单元中存放了00100001,即十进制数33,如果用cout << c ;输出c的值,将得到字符“!”(其ASCII码为33)。

  1. 将signed(有符号)型数据赋给长度相同的unsigned(无符号)型变量,将存储单元内容原样照搬(连原有的符号位也作为数值一起传送)。

例:有符号数据传送给无符号变量

编写程序

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main()
{
unsigned short a;
    short int b=-1;
    a=b;
    cout<<"a="<<a<<endl;
    return 0;
}

运行结果

65535

程序分析

有的读者可能会感到奇怪:我给b赋的值是—1,怎么会得到65535呢?请看下图所示的赋值情况。

-1的补码形式为1111111111111111(即全部16个二进制位均为1),将它传送给a,而a是无符号型变量,16个位全1是十进制的65535。如果b为正值,且在0~32767之间,则赋值后数值不变。

不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传送。未学过补码知识的,对以上的叙述有所了解即可,不必深究。

C和C++使用灵活,在不同类型数据之间赋值时,常常会出现意想不到的结果,而编译系统并不提示出错,全靠程序员的经验来找出问题。这就要求编程人员对出现问题的原因有所了解,以便迅速排除故障。

复合赋值运算符

在赋值符“=”之前加上其他运算符,可以构成复合运算符。如果在“=”前加一个“+”运算符就成了复合运算符“+=”。例如,可以有

符合运算式 等价于
a + = 3 a=a+3
x * = y + 8 x=x * (y+8)
x % = 3 x=x % 3

a + = 3为例来说明,它相当于使a进行一次自加3的操作。即先使a加3,再赋给a。同样,x* = y+8的作用是使x乘以(y+8),再赋给x。

赋值表达式

由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。

它的一般形式为

变量 = 表达式

如“a=5”是一个赋值表达式。对赋值表达式求解的过程是:先求赋值运算符右侧的“表达式”的值,然后赋给赋值运算符左侧的变量。一个表达式应该有一个值,例如,赋值表达式a = 3*5的值为 15,执行表达式后,变量 a 的值也是 15。

C++将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中,如,cout << (a=b);,如果b的值为3,则输出a的值(也是表达式a=b的值)为3。在一个语句中完成了赋值和输出双重功能。这是C++语言灵活性的一种表现。


结束语

以上,是笔者整理的自我认为本章内重要的内容,内容多数来自《C++程序设计(第三版)》中的第二章内容,希望可以帮助到正在阅读本片文章的你,最后,感谢你的阅读,祝你生活愉快,学习顺利