(++a)+=(a++)怎么理解?

syscofield 2013-03-01 07:55:05
int a=4;
cout<<(++a)+=(a++)<<endl; //结果为10
cout<<a<<endl; //结果为11
帮忙分析下啊,谢谢了。
...全文
333 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-03-04
  • 打赏
  • 举报
回复
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单! 指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认: 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物; 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。 这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑! 这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!! 提醒: “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 (Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想要从本质上理解C指针,必须学习C和汇编的对应关系。” 不是一回事! 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!
Defonds 2013-03-04
  • 打赏
  • 举报
回复
看编译器???
SNAKE-SNAKE 2013-03-04
  • 打赏
  • 举报
回复
自己跟汇编!
lin5161678 2013-03-04
  • 打赏
  • 举报
回复
引用 18 楼 zhao4zhong2 的回复:
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borl……
别傻了 这个问题用你这个方法是解决不了的
zhao4zhong2 2013-03-04
  • 打赏
  • 举报
回复
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
ylgm44 2013-03-04
  • 打赏
  • 举报
回复
引用 5 楼 lin5161678 的回复:
未定义行为 如果不懂 楼主可以看看置顶的帖子 或者搜以下关键字 c语言 未定义行为 c语言 序列点[新标准采用一个新概念代替这个序列点 不过目前网上好像没什么资料 暂时看看序列点的介绍吧] c语言 副作用
顶。。 看看序点就知道了。。这种写法是不符合C语言标准的。。可以看作是错误代码。
豁燃开朗 2013-03-04
  • 打赏
  • 举报
回复
说得对,这种代码没什么意义,也不会写这种混乱代码,不能判断一个人的能力。
Yond 2013-03-03
  • 打赏
  • 举报
回复
真实的程序是不会有这么复杂的表达式的,没必要关注,如果真想了解,建议看汇编
Automania 2013-03-01
  • 打赏
  • 举报
回复
看置顶帖: 裘宗燕:C/C++ 语言中的表达式求值 http://bbs.csdn.net/topics/370153775
疯狂的红豆 2013-03-01
  • 打赏
  • 举报
回复
这个问题要引出一个在程序设计语言中的一个概念,这个概念老师很少会讲到,书上也很少看到。序点,你百度一下概念。 C++虽然规定了优先级,但是他没有规定一个表达式的序点在什么位置,所以你的那个表达式对编译器来说有很多种处理方式,取决于编译器的实现了。完全没必要在这个上面花时间纠结啊
豁燃开朗 2013-03-01
  • 打赏
  • 举报
回复
int a=1; int b=a++;//后加 ------------ 分析: int a=1; int b=a; a=a+1;//后加结果作下一次 ================================= ================================= int a=1; int b=++a;//前加 ------------ 分析: int a=1; a=a+1;//前加 int b=a; ================================ ================================ int a=4; (++a)+=(a++); ------------------ 分析: int a=4; (++a)+=a;//<----后加结果作下一次 a=a+1; ------------------- int a=4; a=a+1; a+=a;//<----后加结果作下一次=10 a=a+1;//=11
mujiok2003 2013-03-01
  • 打赏
  • 举报
回复
引用 2 楼 vTerry888 的回复:
没分了,请教如何将char字符转为std::wstring?希望能一步到位。
先多字节字(char)符转换为unicode字符(whcar_t),然后wchar_t转换为字符串std::wstring.

wchar_t ch = L'A';
std::wstring s;
s.append(ch);
mujiok2003 2013-03-01
  • 打赏
  • 举报
回复
引用 2 楼 vTerry888 的回复:
没分了,请教如何将char字符转为std::wstring?希望能一步到位。
借用别人的楼?
mujiok2003 2013-03-01
  • 打赏
  • 举报
回复
考验编译器还是代码阅读者?
zhangtonghui816 2013-03-01
  • 打赏
  • 举报
回复
引用 3 楼 zhangtonghui816 的回复:
C/C++ code?123456789#include <iostream>using namespace std;void main(){ int a=4; cout<<((++a)+=(a++))<<endl; //结果为10 cout<<a<<endl; //结果为11 system("pause");} 纠正一下,需要……
不好意思,我分析的有些问题了,因为((++a)+=(a++))括了个括号,那么是作为整体入栈的,入栈之后还是从左往右分析,不再是从右往左了。 10和11的原因是由于a++引起的。
lin5161678 2013-03-01
  • 打赏
  • 举报
回复
未定义行为 如果不懂 楼主可以看看置顶的帖子 或者搜以下关键字 c语言 未定义行为 c语言 序列点[新标准采用一个新概念代替这个序列点 不过目前网上好像没什么资料 暂时看看序列点的介绍吧] c语言 副作用
zhangtonghui816 2013-03-01
  • 打赏
  • 举报
回复
为什么i++不能做左值而++i可以,看下面两个重载函数
//前缀形式,如++a
int &int::operator++()
{
   *this+=1;
   return *this;
}

//后缀形式,如a++,看到返回值为const int 了吧
const int int::operator++(int)
{
   int oldvalue=*this;
   ++(*this);
   return oldvalue;
}
zhangtonghui816 2013-03-01
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
void main()
{
  int a=4;
  cout<<((++a)+=(a++))<<endl;   //结果为10
  cout<<a<<endl;              //结果为11
  system("pause");
}
纠正一下,需要加一个括号,不然编译都通不过。 首先说第一个cout后面的内容吧,压栈顺序从右向左 (++a)+=(a++)和(++a)=(++a)+(a++)等价,那么先a++,调用后缀++这个运算符重载函数返回副本4,a值变为5,然后(++a),调用前缀++这个运算符重载函数返回a,a为6。 然后输出赋值语句6+4,结果为10就好理解了。 然后再++a,就变成11了。 再说附带的一些东西,++a可以作为左值,a++不行。
vTerry888 2013-03-01
  • 打赏
  • 举报
回复
没分了,请教如何将char字符转为std::wstring?希望能一步到位。
图灵狗 2013-03-01
  • 打赏
  • 举报
回复
不要纠结于这种优先级问题。

64,670

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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