user-0 提问: ++ 自增运算符问题

回复:
user: user-1
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-2
content: 引用 29 楼 laodanbj 的回复:楼上的楼上说的我说法，出这题就该枪毙。  这问题楼主应该自己想办法知道答案。现在的在线调试系统我不知道你用什么，我想大同小异，把你的代码放到调试系统里面，去跟踪它，看它怎么运行，看它的汇编代码是什么，这样你就能通过实践掌握知识，而不是这么死记硬背。而且通过调试系统熟练了代码的调试，不怕慢，这种点点滴滴的积累，有助于你很快成为一个程序员，合格的程序员。毫无意义 不同编译环境可以生成不同逻辑的汇编代码 指望看看汇编代码就弄清楚结果多少 是对C语言了解太肤浅

user: user-2
content: 引用 31 楼 laodanbj 的回复:肤浅？你拿c语言准备写上天的，还是操作系统？一个还没入门的学生，他需要学的基本常识，牙牙学语不要犯低级错误，蹒跚学步他知道前方的目标。我看了两眼，这些刚学者是不知道还有很多方法可以实践，我们刚学的那些天不同样也不知道很多方法可以做吗？老师只需一个比划，胜似啰里啰唆多少口舌。你不要往沟里带。 那么你知不知道什么叫做未定义行为? 知不知道未定义行为应该怎么处理? 看看 #16楼的内容 再回复好么

user: user-3
content: 引用 30 楼 lin5161678 的回复:[quote=引用 29 楼 laodanbj 的回复:] 楼上的楼上说的我说法，出这题就该枪毙。  这问题楼主应该自己想办法知道答案。现在的在线调试系统我不知道你用什么，我想大同小异，把你的代码放到调试系统里面，去跟踪它，看它怎么运行，看它的汇编代码是什么，这样你就能通过实践掌握知识，而不是这么死记硬背。而且通过调试系统熟练了代码的调试，不怕慢，这种点点滴滴的积累，有助于你很快成为一个程序员，合格的程序员。毫无意义 不同编译环境可以生成不同逻辑的汇编代码 指望看看汇编代码就弄清楚结果多少 是对C语言了解太肤浅[/quote]  肤浅？你拿c语言准备写上天的，还是操作系统？一个还没入门的学生，他需要学的基本常识，牙牙学语不要犯低级错误，蹒跚学步他知道前方的目标。我看了两眼，这些刚学者是不知道还有很多方法可以实践，我们刚学的那些天不同样也不知道很多方法可以做吗？老师只需一个比划，胜似啰里啰唆多少口舌。你不要往沟里带。

user: user-3
content: 楼上的楼上说的我说法，出这题就该枪毙。  这问题楼主应该自己想办法知道答案。现在的在线调试系统我不知道你用什么，我想大同小异，把你的代码放到调试系统里面，去跟踪它，看它怎么运行，看它的汇编代码是什么，这样你就能通过实践掌握知识，而不是这么死记硬背。而且通过调试系统熟练了代码的调试，不怕慢，这种点点滴滴的积累，有助于你很快成为一个程序员，合格的程序员。

user: user-4
content: c++标准并没有规定表达式的求值顺序，所以没有确定答案。请参见：《C++ Primer中文版第五版》4.1.3表达式求值顺序。

user: user-5
content: 都已经无数人告诉你了，不同编译器答案不一样，你告诉我这题有正确答案？算了，你继续自嗨吧。 引用 23 楼 不灭的追求 的回复:想必那些出题人的心里也是这么想的。 这都不懂，这都不会，这都能错。

user: user-6
content: ++运算符 优先级高于+   全部递增后，即m为9，在+，  所以k为9+9+9

user: user-7
content: 这种问题已经成为了月经题了 每个月都会有人去问 都跟你明确说了纠结下去没有意义 千万不要想当然 强行去理解啊  这就好比有人在那宣扬传销 你不解为什么他们传销的说的天花乱坠振振有词  于是你来论坛问为什么传销好 然后有人给你指出传销不是什么好东西你反问一句那什么是好的 那我觉得你应该在等一个经历过传销的大佬来给你指点迷津了

user: user-0
content: 想必那些出题人的心里也是这么想的。 这都不懂，这都不会，这都能错。

user: user-8
content: 引用 18 楼 不灭的追求 的回复:那[1] k=（++a）+（++a）*（++a）              A：k=9+7*8              B：k=7+8*9     [2]  k=（++a）-（++a）+（++a）              C：k=9+7+8              D：k=7-8+9 选项A,B,C,D哪个：  这种题不用做，然后心里默默骂一句出题人sb。

user: user-0
content: 引用 20 楼 niiiloc的回复:这种结帖率0又执迷不悟的人，就让他继续研究这种无用的问题吧 恕我冒昧问一句，什么是有用的问题(O_O)？

user: user-5
content: 这种结帖率0又执迷不悟的人，就让他继续研究这种无用的问题吧

user: user-9
content: 引用 18 楼 不灭的追求 的回复:那[1] k=（++a）+（++a）*（++a）              A：k=9+7*8              B：k=7+8*9     [2]  k=（++a）-（++a）+（++a）              C：k=9+7+8              D：k=7-8+9 选项A,B,C,D哪个：  （++a）+（++a）*（++a）的msvc和gcc结果都是9 + 9 * 9 = 90。 gcc：乘法运算优先级高于加法，是先计算乘法再计算加法，但是基于表达式树状结构，加法的左操作数++a和（++a）*（++a）是同一层级的，从左到右计算操作数，即先计算左操作数++a，再计算 （++a）*（++a）。  （++a）-（++a）+（++a）的msvc(9-9+9)和gcc(8-8+9)结果都是9。  这种标准未定义行为自己在编译器上动手更好理解，别再这里猜测。

user: user-0
content: 那[1] k=（++a）+（++a）*（++a）              A：k=9+7*8              B：k=7+8*9     [2]  k=（++a）-（++a）+（++a）              C：k=9+7+8              D：k=7-8+9 选项A,B,C,D哪个：

user: user-0
content: 引用 16 楼 sdghchj的回复:https://en.cppreference.com/w/c/language/eval_order  Consider two functions f() and g(). In C and C++, the + operator is not associated with a sequence point, and therefore in the expression f()+g() it is possible that either f() or g() will be executed first.  加法的+符号并没有序列点，也就没规定计算顺序，自然其带来的副作用也就视实际编译器实现的计算顺序而定。  msvc是27，gcc结果是25， 不同编译器结果不一样，这就是未定义行为，所以并不建议实际开发中写这种代码。  gcc: 先计算第一个加法表达式，它是二元操作符，自然要更先计算完两边的操作数表达式，计算出两个操作数，然后得出加法结果，8 + 8 = 16；再计算第二个加法，第二个加法的左操作数16已经确定，先计算右操作数9，结果25.  msvc：略，结果27，你懂的。  如果按标准，21、24、25、27都是可能的结果，你可以自己写个编译器去实现结果24的那种。  https://blog.csdn.net/tsroad/article/details/49834261 那就是说，实际执行流程是顺序结构,如下：          k=(++a)+(++a)+(++a) [1]：k=(6+1=7)+(++a)+(++a) [2]：k=7+(7+1=8)+(++a) [3]：k=8+8+(++a) [4]：k=16+(8+1=9) [5]:   k=8+8+9 [6]:   k=25 结果不同原因：计算顺序问题。 原本以为你是个青铜，没想到你是个王者哈。 感谢大佬辛苦为我解惑。

user: user-10
content: 出这种题的人都该送进监狱  写这种代码的人都该枪毙

user: user-9
content: https://en.cppreference.com/w/c/language/eval_order  Consider two functions f() and g(). In C and C++, the + operator is not associated with a sequence point, and therefore in the expression f()+g() it is possible that either f() or g() will be executed first.  加法的+符号并没有序列点，也就没规定计算顺序，自然其带来的副作用也就视实际编译器实现的计算顺序而定。  msvc是27，gcc结果是25， 不同编译器结果不一样，这就是未定义行为，所以并不建议实际开发中写这种代码。  gcc: 先计算第一个加法表达式，它是二元操作符，自然要更先计算完两边的操作数表达式，计算出两个操作数，然后得出加法结果，8 + 8 = 16；再计算第二个加法，第二个加法的左操作数16已经确定，先计算右操作数9，结果25.  msvc：略，结果27，你懂的。  如果按标准，21、24、25、27都是可能的结果，你可以自己写个编译器去实现结果24的那种。  https://blog.csdn.net/tsroad/article/details/49834261

user: user-5
content: 自己看汇编去，不同编译器实现不一样 不要这么自以为是，要么你自己写个编译器解读为9+9+9 引用 10 楼 不灭的追求 的回复:[quote=引用 9 楼 niiiloc的回复:]日经序列点问题，未定义行为，有确切结果的都是错的 我们讨论的是这句话的问题。 自增运算符的计算。 其他定义什么的自己脑补，不做考虑。 不要想太多。 总结一下问题: 为什么是24（7+8+9）而不是27（9+9+9）？[/quote]

user: user-11
content: 感觉书上的有问题，就是未定义行为吧