这个表达式(a+=a-=a*=a)到底从哪头运算啊,我都晕了

chaoyueheike 2009-02-25 10:15:03
a+=a-=a*=a
就是这个表达式、
...全文
951 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zcs198404 2009-02-26
  • 打赏
  • 举报
回复
a+=a-=a*=a
a+=a-=(a=a*a) (a=a*a)

(a=a+a)-=(a=a*a) (a=2a*a)

(a=a+a)=(a=a+a)-(a=a*a)
a=0


最后(a+=a-=a*=a )= 0
yellowhwb 2009-02-26
  • 打赏
  • 举报
回复
看一下VC6的汇编就知道了

489: int a = 3;
00401268 mov dword ptr [ebp-4],3
490: a+=a-=a*=a;
0040126F mov eax,dword ptr [ebp-4] //a的值放到eax
00401272 imul eax,dword ptr [ebp-4] //eax = eax * a
00401276 mov dword ptr [ebp-4],eax //a = eax 此时a*=a执行完了
00401279 mov ecx,dword ptr [ebp-4] //ecx = a
0040127C sub ecx,dword ptr [ebp-4] //ecx = ecx - a
0040127F mov dword ptr [ebp-4],ecx //a = ecx 此时a-=a执行完了
00401282 mov edx,dword ptr [ebp-4] //edx = a
00401285 add edx,dword ptr [ebp-4] //edx = edx + a
00401288 mov dword ptr [ebp-4],edx //a = edx 此时a+=a执行完了

所以执行顺序是:
(如果a初始为2)
a*=a; 此时a为4
a-=a; 此时a为0
a+=a; 此时a为0

表达式结果恒为0
dzc8866 2009-02-26
  • 打赏
  • 举报
回复
欠抽的表达式!!!UP
pcjbird 2009-02-26
  • 打赏
  • 举报
回复
really bad.
Big鹏 2009-02-26
  • 打赏
  • 举报
回复

从右到左。
起点 2009-02-25
  • 打赏
  • 举报
回复
看晕了
sxbwelcome 2009-02-25
  • 打赏
  • 举报
回复
a+=a-=a*=a
所有的赋值运算符的优先级都是同样的,结合性为后结合性
所以它等价于a=a+(a=a-(a=a*a))
sayigood 2009-02-25
  • 打赏
  • 举报
回复
1 算术操作符为左结合,赋值操作符是右结合性;
2 *= /= %= += -= < <= >>= &= |= ^=为复合赋值操作符,
为了便于记忆,这些复合赋值操作符可以与=一起被当作
1中所说的赋值操作符,因此是又结合的;

a+=a-=a*=a -------》(a+=(a-=(a*=a)))
  • 打赏
  • 举报
回复
从右往左算.
a=a*a;
a=a-a;//这个时候为0
a=a+a;
arong1234 2009-02-25
  • 打赏
  • 举报
回复
所以千万不要写出这种表达式。这种表达式只有不会编程的人和一些垃圾考试中才看到

[Quote=引用楼主 chaoyueheike 的帖子:]
a+=a-=a*=a
就是这个表达式、
[/Quote]
lingyin55 2009-02-25
  • 打赏
  • 举报
回复
lz记着单目运算符一般是右结合,双目一般是从左到右结合就行。基本的运算就可以判断了。
muhuo88 2009-02-25
  • 打赏
  • 举报
回复
先是a=a*a
a=a-a=0;
也就是说这个式子为0;
uljxncel 2009-02-25
  • 打赏
  • 举报
回复
听说有些是右结合,有些是左结合....我也晕晕的
lingyin55 2009-02-25
  • 打赏
  • 举报
回复
参考这个吧

C++的优先级
优先级 操作符 结合性
1 :: 左
2 . -> [] () 左
3 ++ -- ~ ! - + & * () sizeof new delete castname_cast<type> 单目操作符 右
4 .* ->* 左
5 * / % 左
6 + - 左
7 << >> 左
8 < <= > >= 左
9 == != 左
10 & 左
11 ^ 左
12 | 左
13 && 左
14 || 左
15 ?: 右
16 = *= /= %= += -= <<= >>= &= |= ^= 右
17 throw 左
18 , 左
waizqfor 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 chaoyueheike 的帖子:]
a+=a-=a*=a
就是这个表达式、
[/Quote]
这种代码 很不好 写出来可读性还差
一般都没人

LZ想看这个代码的 运算过程可以去编程实现一下 看看汇编

赋值运算符的结合性 是 从右向左 自己推断一下就有结果了

70,014

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧