C语言的赋值运算符会返回左值的地址

今天遇到个赋值返回的问题,查了一下,结果惊呆了了。

#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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值