今天遇到个赋值返回的问题,查了一下,结果惊呆了了。
#include <stdio.h>
int main()
{
int a = 1;
int c = (a*=2) + (a+=3);
printf("a = %d, c = %d\n", a, c);
return 0;
}
int c = (a*=2) + (a+=3)
(a*=2)=1*2=2,(a+=3)=2+3=5,a=5;
c=2+5=7,要是这么想的话就错了。
实际上正确答案是c=5+5=10。
原因在于C语言的赋值运算符会返回左值的地址而不是值
也就是说(a+=3)后,a=5;a的地址存放的是5。
那么c实际上等于a+a=5+5=10.
#include <stdio.h>
int main()
{
int a = 1;
printf("%d, %d, a = %d\n", (a*=2), (a+=2), a);
return 0;
}
这个例子输出为结果为
- 6,6
和上面同样的道理,不过printf()函数从右往左压栈,因此先执行 (a+=2),在到(a*=2);
运算后a地址存放为6.