user-0 提问: mango[i++] += y;为什么被编译成mango[i]  = mango[i] + y; i++

回复:
user: user-1
content: 引用 13 楼 mujiok2003 的回复:[quote=引用 10 楼 yzl1992yzl 的回复:] [quote=引用 8 楼 mujiok2003 的回复:] 看看运算符的优先级和结合性运算符的优先级看了，就是有不理解的地方，对于arr[i++]来说[]操作符是在i的左边还是右边？还有arr[i++] += 1;这个语句中+=运算符的优先级最低，那不就等价于下面吗？(arr[i++]) += 1; 对于上面的这句为什么不是(arr[i++]) = (arr[i++])  + 1;[/quote]  这个又不是宏替换， 干嘛要换到右边。 += 本身就是一个运算符。 [/quote]+1

user: user-0
content: 不对，第一次和第二次地址不一样，帖子怎么不能编辑啊

user: user-0
content: 晕，为什么都说是优先级的问题，刚才看了看C标准，里面有一句对复合赋值操作 a op= b 表达式a只求值一次，就是对于arr[i++] += 1;只对arr[i++]求值一次，要对他求值必须先取得他的地址，因此取地址就是一次，赋值的时候使用的是第一次求值时使用的对应元素的地址，如下：  00A57234 8B 45 E0             mov         eax,dword ptr [ebp-20h]   00A57237 8B 4C 85 EC          mov         ecx,dword ptr [ebp+eax*4-14h]   00A5723B 83 C1 0A             add         ecx,0Ah   00A5723E 8B 55 E0             mov         edx,dword ptr [ebp-20h]   00A57241 89 4C 95 EC          mov         dword ptr [ebp+edx*4-14h],ecx   00A57245 8B 45 E0             mov         eax,dword ptr [ebp-20h]   00A57248 83 C0 01             add         eax,1   00A5724B 89 45 E0             mov         dword ptr [ebp-20h],eax 所以i增加了一次而不是i增加了两次

user: user-2
content: 引用 10 楼 yzl1992yzl 的回复:[quote=引用 8 楼 mujiok2003 的回复:] 看看运算符的优先级和结合性运算符的优先级看了，就是有不理解的地方，对于arr[i++]来说[]操作符是在i的左边还是右边？还有arr[i++] += 1;这个语句中+=运算符的优先级最低，那不就等价于下面吗？(arr[i++]) += 1; 对于上面的这句为什么不是(arr[i++]) = (arr[i++])  + 1;[/quote]  这个又不是宏替换， 干嘛要换到右边。 += 本身就是一个运算符。

user: user-3
content: C是一门很灵活的语言，语言灵活，人也得灵活，就这样，不然就用不好这门语言

user: user-3
content: []  (下标运算符)　优先级比    ++   (自增运算符) 　　要高，所以arr[i++]实际上会先执行arr[i]，然后执行i++。  说到底还是运算符优先级问题，C语言运算符优先级表http://wenku.baidu.com/view/302b9e89a0116c175f0e48f0.html，你弄不明白运算符优先级问题，永远也不会明白你提出的问题。先弄明白再来讨论吧。

user: user-0
content: 引用 8 楼 mujiok2003 的回复:看看运算符的优先级和结合性运算符的优先级看了，就是有不理解的地方，对于arr[i++]来说[]操作符是在i的左边还是右边？还有arr[i++] += 1;这个语句中+=运算符的优先级最低，那不就等价于下面吗？(arr[i++]) += 1; 对于上面的这句为什么不是(arr[i++]) = (arr[i++])  + 1;

user: user-0
content: 引用 6 楼 CS1024 的回复:忘了，[]也"优先"++ 对于arr[i++]来说[]操作符是在i的左边还是右边？

user: user-2
content: 看看运算符的优先级和结合性

user: user-0
content: 引用 5 楼 CS1024 的回复:=优先到++  i++与 x += 1完全不一样 对于x += 1，+优先于=，所以， x += 1等价于 x = x+1  同理，mango[i++] += y; +优先于=优先于++，因此mango[i]  = mango[i] + y;i++;  再不明白，去看运算优先符问题#include <stdio.h> int main(void) { 	int arr[3] = {0,0,0}, i = 0;  	(arr[i++]) += 1;  	printf("%d %d %d\n", arr[0], arr[1], arr[2]);  	return 0; } 好，那你看这个，(arr[i++])不是一个整体吗，既然 x += 1等价于 x = x+1那么为什么(arr[i++]) += 1;不是(arr[i++]) = (arr[i++]) +1;

user: user-3
content: 忘了，[]也"优先"++

user: user-3
content: =优先到++  i++与 x += 1完全不一样 对于x += 1，+优先于=，所以， x += 1等价于 x = x+1  同理，mango[i++] += y; +优先于=优先于++，因此mango[i]  = mango[i] + y;i++;  再不明白，去看运算优先符问题

user: user-0
content: 引用 3 楼 CS1024 的回复:运算优先符问题， mango[i]  = mango[i] + y;//先加  i++;//后自增这句正是我问的为什么和这样等价，我不知道的是为什么不是mango[i++] = mango[i++] + y;而是mango[i]  = mango[i] + y;i++； 运算符 x += 1 不是等价于 x = x+1 吗

user: user-3
content: 运算优先符问题， mango[i]  = mango[i] + y;//先加  i++;//后自增

user: user-0
content: 引用 1 楼 lovesmiles 的回复:看一下置顶贴子吧，c++版块的置顶贴是专治你的问题的。  我简单回答一下你，i++这个行为++是要到一句语句结束了才会执行的，你上述的代码，不管中间有=号，有+号还是有什么号运算，都要语句结束了，才执行i++。  具体你还是看置顶贴子。你说的是http://bbs.csdn.net/topics/370153775这个吧，这个我看了，i++的副作用++不是要在序点之前完成吗？

user: user-4
content: 看一下置顶贴子吧，c++版块的置顶贴是专治你的问题的。  我简单回答一下你，i++这个行为++是要到一句语句结束了才会执行的，你上述的代码，不管中间有=号，有+号还是有什么号运算，都要语句结束了，才执行i++。  具体你还是看置顶贴子。