user-0 提问: 这个程序的执行结果你猜到了吗？

回复:
user: user-1
content: 123？ 利用两个临时变量地址 连续，不一定永远是这样的。

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-3
content: 它的结果也只能撞大运了。

user: user-4
content: 使用错误的方式, 结果都是很难预料的,  按MSDN上的说法叫: 行为未定义 依赖编译器和优化, 不要以为在一台或者几台机器上是这样, 那就你想的那样.

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:楼主闲来无事还是研究一下这个代码显示几吧： #include <conio.h> void main() {     int r,k;     cprintf("Press any key ...");     r=0;     while (1) {         r=(r+1)%100;         if (kbhit()) {             k=getch();             if (0==k || 0xe0==k) getch();             break;         }     }     cprintf("\r\n%d\r\n",r); }  这个kbhit还有点意思，cprintf也不错，受教了

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 说技术，不要说这些没用的，你有时间码这些字，我可没时间看，不要倚老卖老了

user: user-5
content: 地址會是連續的嗎? 感覺不會是123

user: user-2
content: 楼主闲来无事还是研究一下这个代码显示几吧： #include <conio.h> void main() {     int r,k;     cprintf("Press any key ...");     r=0;     while (1) {         r=(r+1)%100;         if (kbhit()) {             k=getch();             if (0==k || 0xe0==k) getch();             break;         }     }     cprintf("\r\n%d\r\n",r); }

user: user-2
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-0
content: 引用 3 楼 xiaohuh421 的回复:使用错误的方式, 结果都是很难预料的,  按MSDN上的说法叫: 行为未定义 依赖编译器和优化, 不要以为在一台或者几台机器上是这样, 那就你想的那样. 引用 5 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！ 对，你们说的有道理，我说一下我的观点：不要拿未定义当做借口不去深究这个问题在什么情况下未定义，而在什么情况下输出的结果就是123 上面的例子p指针不减1行不行？ 函数怎样压栈和退栈的？（上面的例子运行成功，就说明函数压栈和退栈的形式是一样的，而且栈地址是连续的） 在什么情况下上面的程序会崩溃？ 将指针引用到操作系统内存上会不会导致严重问题？其他地址呢？ 将上述情况用在堆上行不行？ 申请堆上的内存连续不连续？ 等等，你们有没有考虑过？