C++ 赋值操作符

赋值操作符的返回值

1.

a=1;

cout<<a++;

打印:1

cout<<++a;

打印:2

2.

a=1;
 

c = ( a *= 2 ) + ( a += 3 );

结果:a=5, c=10

c = ( a += 3 ) + ( a *= 2 );

结果:a=8, c=16

解释:

()的优先级大于+和=,所以先做赋值,再做两者之和

a *= 2 是a变为2(改变a的地址中的值),a+=3,再使a变为5,所以,c=5+5;

同理,第二个c=16;

3.

++a将返回a的地址,而a++也因为是赋值操作符而必须返回一个地址,但很明显地不能是a的地址了,因此编译器将编写代码以从栈中分配一块和a同样大小的内存,并将a的值复制到这块临时内存中,然后返回这块临时内存的地址。由于这块临时内存是因为编译器的需要而分配的,与程序员完全没有关系,因此程序员是不应该也不能写这块临时内存的(因为编译器负责编译代码,如果程序员欲访问这块内存,编译器将报错),但可以读取它的值,这也是返回地址的主要目的。所以如下的语句没有问题:

( ++a ) = a += 34;

但( a++ ) = a += 34;就会在编译时报错,因为a++返回的地址所标识的内存只能由编译器负责处理,程序员只能获得其值而已。
a++的意思是先返回a的值,也就是上面说的临时内存的地址,然后再将变量的值加一。如果同时出现多个a++,那么每个a++都需要分配一块临时内存(注意前面c = ( a += 3 ) + ( a *= 2 );的说明),那么将有点糟糕,而且a++的意思是先返回a的值,那么到底是什么时候的a的值呢?在VC中,当表达式中出现后缀“++”或后缀“—”时,只分配一块临时内存,然后所有的后缀“++”或后缀“—”都返回这个临时内存的地址,然后在所有的可以计算的其他操作符的值计算完毕后,再将对应变量的值写入到临时内存中,计算表达式的值,最后将对应变量的值加一或减一。
因此:a = 1; c = ( a++ ) + ( a++ );执行后,c的值为2,而a的值为3。而如下:

a = 1; b = 1; c = ( ++a ) + ( a++ ) + ( b *= a++ ) + ( a *= 2 ) + ( a *= a++ );
  执行时,先分配临时内存,然后由于5个“()”,其计算顺序是从左向右,

  计算++a的值,返回增一后的a的地址,a的值为2

  计算a++的值,返回临时内存的地址,a的值仍为2

  计算b *= a++中的a++,返回临时内存的地址,a的值仍为2

  计算b *= a++中的“*=”,将a的值写入临时内存,计算得b的值为2,返回b的地址

  计算a *= 2的值,返回a的地址,a的值为4

  计算a *= a++中的a++,返回临时内存的地址,a的值仍为4

  计算a *= a++中的“*=”,将a的值写入临时内存,返回a的地址,a的值为16

  计算剩下的“+”,为了进行计算,将a的值写入临时内存,得值16 + 16 + 2 + 16 + 16为66,写入c中

  计算三个a++欠下的加一,a最后变为19。


在表达式中运用赋值操作符是不被推崇的。因为其不符合平常的数学表达式的习惯,且计算顺序很容易搞混。如果有多个“++”操作符,最好还是将表达式分开,否则很容易导致错误的计算顺序而计算错误。并且导致计算顺序混乱的还不止上面的a++就完了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值