#include<stdio.h>
void main()
{
    int a=1;
    int c;
    c=(a*=2)+(a+=3);
    printf("c=%d",c);
    getch();
}

c变量的输出值是多少?为什么会是16?

操作符就是将给定的数字做一些处理,然后返回一个数字。而操作符的计算也就是执行操作符的处理,并返回值。前面已经知道,操作符是个符号,其一侧或两侧都可以接数字,也就是再接其他操作符,而又由于赋值操作符也属于一种操作符,因此操作符的执行顺序变得相当重要。
对于a + b + c,将先执行a + b,再执行( a + b ) + c的操作。你可能觉得没什么,那么如下,假设a之前为1
c = ( a *= 2 ) + ( a += 3 );
上句执行后a5。而c = ( a += 3 ) + ( a *= 2 );执行后,a就是8了。那么c呢?结果可能会大大的出乎你的意料。前者的c10,而后者的c16
         
上面其实是一个障眼法,其中的“+”没有任何意义,即之所以会从左向右执行并不是因为“+”的缘故,而是因为( a *= 2 )( a += 3 )的优先级相同,而按照“()”的计算顺序,是从左向右来计算的。但为什么c的值不是预想的2 + 54 + 8呢?因为赋值操作符的返回值的关系
赋值操作符返回的数字不是变量的值,而是变量对应的地址。这很重要。前面说过,光写一个变量名就会返回相应变量的值,那是因为变量是一个映射,变量名就等同于一个地址。C++中将数字看作一个很特殊的操作符,即任何一个数字都是一个操作符。而地址就和长整型、单精度浮点数这类一样,是数字的一种类型。当一个数字是地址类型时,作为操作符,其没有要操作的数字,仅仅返回将此数字看作地址而标识的内存中的内容(用这个地址的类型来解释)。地址可以通过多种途径得到,如上面光写一个变量名就可以得到其对应的地址,而得到的地址的类型也就是相应的变量的类型。如果这句话不能理解,在看过下面的类型转换一节后应该就能了解了。
         
所以前面的c = ( a += 3 ) + ( a *= 2 );,由于“()”的参与改变了优先级而先执行了两个赋值操作符,然后两个赋值操作符都返回a的地址,然后计算“+”的值,分别计算两边的数字——a的地址(a的地址也是一个操作符),也就是已经执行过两次赋值操作的a的值,得8,故最后的c16

阅读全文
类别:默认分类 查看评论
posted on 2011-05-16 23:31  sinbad_li  阅读(1335)  评论(0编辑  收藏  举报