gpt4 book ai didi

无法理解C中减少/增加 'for'的逻辑

转载 作者:行者123 更新时间:2023-11-30 21:19:48 29 4
gpt4 key购买 nike

enter image description here

我对此进行了编码,当我在 win10(代码块)上运行时,数字不会按新月顺序组织,但是当我在 Linux(ubuntu 14 - 代码块)上运行它时,它会按新月顺序组织。有人能告诉我为什么吗? (代码很简单,就不多阐述了。

#include "stdio.h"
#include "stdlib.h"

int main(int argc, char *argv[])
{

int i=0, j, num[2], aux;

for (i =0; i<3; i++)
{
printf (" Enter a value for num %d ", i+1);
scanf ("%d", &num[i]);
}

for (i =0; i<3; i++)

{
for (j=0; j<3; j++){
if (num[j] > num[j+1])
{
aux = num[j];
num[j] = num[j+1];
num[j+1] = aux;

}
}
}
for (i=1; i<4; i++)
{
printf("%d", num[i]);
printf("\n");
}


system("PAUSE");
return 0;
}

最佳答案

无论是在 Linux 中还是在 Windows 中,你的逻辑都行不通。获得正确的结果纯属运气问题,因为您访问的内存超过了声明数组的末尾(第一对循环使用索引2,最后一个循环迭代到索引 4,而您的 int num[2] 数组只有两个元素:num[0]num [1])。这会触发所谓的未定义行为,这可能会导致任何结果,从返回正确的结果,到使程序崩溃,直至销毁它。

编辑

为了增加一些洞察力,请考虑局部变量:ijnum[]aux 。此类变量通常位于堆栈上,通常按照声明的顺序(或完全相反)。简单变量,例如 iaux 可能会分配在某些 CPU 寄存器中,但这取决于编译器的优化级别。

因此变量的布局可能如下所示:

--------------------------------------------------------------
| | | | | |
... | i | j | num[0] | num[1] | aux | ...
| | | | | |
--------------------------------------------------------------

这意味着,当您到达 num[] 数组中索引超过数组长度的一项时,您很可能实际上访问了 aux 变量。

因此,一旦您输入第三个值,您实际上会将其存储在 aux 中,第一次执行后该值将立即被覆盖

aux = num[j];

另一个错误隐藏在内部 for 循环和其中的 if 条件之间。你能发现它吗...?

看:

      for (j=0; j<3; j++){
if (num[j] > num[j+1])
....

看到了吗? 即使num[]数组有3个项目长,这也会遇到UB,因为在最后一次迭代中你有j==2因此索引 [j+1] 将超出范围。

关于无法理解C中减少/增加 'for'的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46489003/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com