user-0 提问: 重大问题，请大家解释。

回复:
user: user-0
content: 所以请大神慎重发言，不要满嘴跑火车……

user: user-0
content: 引用 19 楼 zhao4zhong1 的回复:“C语句”和“对应汇编语句”之间的关系如同“表象”和“本质”之间的关系。 不看“本质”，很难或者不可能理解“表象”。  按照大神的说法，C的世界有着无限可能多的“本质”。原因很简单，子表达式的副作用和值的计算是无序的，所以，每个C的实现都可以自己决定这些顺序。所以，同一个表达式的求值，它们的“对应汇编语句”各自不同，所以“本质”也各不相同。

user: user-1
content: “C语句”和“对应汇编语句”之间的关系如同“表象”和“本质”之间的关系。 不看“本质”，很难或者不可能理解“表象”。

user: user-0
content: 有些东西不是想不想能决定的。 置顶帖也是一沓糊涂的说……

user: user-2
content: 从来不写这种代码，玩玩就行了。。。有些东西由编译器决定

user: user-3
content: 引用 15 楼 lm_whales 的回复:i = 在修改 i,*p=0, 也在修改 i, 不能确定i  应该 = 0+0 还是 0+10086； *q 应该 = 10086 还是 0，是没定义的重新看了下置顶贴，释然了~谢谢

user: user-4
content: i = 在修改 i,*p=0, 也在修改 i, 不能确定i  应该 = 0+0 还是 0+10086； *q 应该 = 10086 还是 0，是没定义的

user: user-3
content: 引用 12 楼 lm_whales 的回复:[quote=引用 11 楼 Automation_dmu 的回复:] [quote=引用 8 楼 sholber 的回复:] 再来看看这个：   int i = 10086, * p = & i, * q = & i; i = (* p = 0) + * q 这个没什么问题吧 ， * 的优先级高于 =和+[/quote] 有问题 有个()改变了优先级[/quote]i = ((*p)=0)+ (*p) = 0+0  =0 看不出问题在哪

user: user-5
content: 引用 27 楼 sholber 的回复:[quote=引用 26 楼 u013573183 的回复:] 你这个不能为难编译器,他没办法监测出来  对于求值顺序不确定的解决办法也简单,同一条语句中只修改一个值,那肯定不会存在问题  或者你能明确的明白自己所修改的两个值是不同的变量.  要么就是在C++标准中强制规定  你要弄清语句、副作用和序列点之间的关系。不是说在同一条语句中就不能修改同一个对象的值。下面是个例子：  x = 5, x++;  //（逗号）表达式语句  if (x=y) x++;  //if语句   未定义的行为不单纯和两个副作用有关，也会在一个副作用和一个值的计算之间发生。[/quote  我所表达的观点是用一种简单的方式避免这种错误, 不是说不能,是不这样做可以避免.  有一些运算是定义了求值顺序的 比如 && 的短路特性,但是如果某类重载了此运算符,则短路特性也会消失

user: user-0
content: 引用 26 楼 u013573183 的回复:你这个不能为难编译器,他没办法监测出来  对于求值顺序不确定的解决办法也简单,同一条语句中只修改一个值,那肯定不会存在问题  或者你能明确的明白自己所修改的两个值是不同的变量.  要么就是在C++标准中强制规定  你要弄清语句、副作用和序列点之间的关系。不是说在同一条语句中就不能修改同一个对象的值。下面是个例子：  x = 5, x++;  //（逗号）表达式语句  if (x=y) x++;  //if语句   未定义的行为不单纯和两个副作用有关，也会在一个副作用和一个值的计算之间发生。

user: user-5
content: 你这个不能为难编译器,他没办法监测出来  对于求值顺序不确定的解决办法也简单,同一条语句中只修改一个值,那肯定不会存在问题  或者你能明确的明白自己所修改的两个值是不同的变量.  要么就是在C++标准中强制规定

user: user-0
content: 他那么菜,很少能看到回答道点子上的答案

user: user-5
content: 他那么菜,很少能看到回答道点子上的答案   是未定义的  主要原因在于 求值顺序不确定

user: user-1
content: 任何问题，首先是一个哲学问题，不是吗？ 参考《黑客帝国》 搜“《黑客帝国》完全解析”

user: user-1
content: 引用 20 楼 sholber 的回复:[quote=引用 19 楼 zhao4zhong1 的回复:] “C语句”和“对应汇编语句”之间的关系如同“表象”和“本质”之间的关系。 不看“本质”，很难或者不可能理解“表象”。  按照大神的说法，C的世界有着无限可能多的“本质”。原因很简单，子表达式的副作用和值的计算是无序的，所以，每个C的实现都可以自己决定这些顺序。所以，同一个表达式的求值，它们的“对应汇编语句”各自不同，所以“本质”也各不相同。[/quote] “世间具体的万事万物”和“对应内部或底层机制或结构”之间的关系如同“表象”和“本质”之间的关系。 不看“本质”，很难或者不可能理解“表象”。 就算自以为理解了“表象”比如引力、电磁力、时间、能量……，等哪天其“本质”被进一步发现后，也会重新理解或者完全推翻以前的理解。

user: user-0
content: 楼上所言不差。

user: user-4
content: 引用 11 楼 Automation_dmu 的回复:[quote=引用 8 楼 sholber 的回复:] 再来看看这个：   int i = 10086, * p = & i, * q = & i; i = (* p = 0) + * q 这个没什么问题吧 ， * 的优先级高于 =和+[/quote] 有问题 有个()改变了优先级

user: user-0
content: 再来看看这个：   int i = 10086, * p = & i, * q = & i; i = (* p = 0) + * q

user: user-0
content: 楼上就是这样得到高分并获得华章赠书的啊……学习了……

user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？