评论:我

首先,请看看这样一个简单的小程序:




#包括

主()
{
int,b { 10 };
对于(i = 0;i < = 10);




我


首先,请看看这样一个简单的小程序:





#包括

主()
{
int,b { 10 };
对于(i = 0;i < 10;i +)
{
0;
}
}





这个程序有错误吗A.正常b边界。

正确答案是C,和一个朋友认为在选择或选择B将困惑。其实我也是如此,只是从表面上的程序,根据这个定义应该是有边界的,因为当周期当我= = 10,程序会尝试B { 10 }值0,而C语言、B { 10 }语句指定B { 0 } ~ B { 9 }。

但你知道,这个程序的结果是一个死循环。

好吧,让程序告诉你mdash;mdash;我mdash;mdash;这一切的真相,而在这之前,请更改定义我和B { 10 }:





int i = 0,b { 10 } { 1, 2, 3,4, 5, 6,7, 8, 9,10 };





然后,程序被分解以获得以下内容:



让我解释一下这个汇编代码的含义。在系统的实现中,i和数组B { 10 }是在堆栈上分配的变量,内存中的分布如下所示:



现在你知道了,我被B 10 { }的位置占据了,B { 10 } = 0;这个句子会像这样运行:





*(b { 0 } + 10)=0;





所以这个句子的结果是将0分配给i,这样,当第十一个循环完成时,我将被重置为0。那么循环结束的条件永远不会满足。循环也是一个死循环。

事实上,单独讨论C语言的内部实现是没有意义的,而且这个循环在程序设计中是绝对不够的,所以我想讨论的是如何让汇编程序帮助我们解决表面上不可见的东西,这就是全部。