Can';不理解递减/递增'的逻辑;对于';在C中
我编写了这个代码,当我在win10(代码块)上运行时,numbers不会按新月顺序组织,但当我在linux(ubuntu 14代码块)上运行它时,它是有组织的。有人能告诉我为什么吗?(代码非常简单,没有太多详细说明Can';不理解递减/递增'的逻辑;对于';在C中,c,C,我编写了这个代码,当我在win10(代码块)上运行时,numbers不会按新月顺序组织,但当我在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++) { pr
#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;
}
#包括“stdio.h”
#包括“stdlib.h”
int main(int argc,char*argv[])
{
int i=0,j,num[2],aux;
对于(i=0;i您的逻辑在Linux和Windows中都不起作用。获得正确的结果纯粹是运气使然,因为您访问的内存超过了声明数组的末尾(第一对循环使用index2
,最后一个循环迭代到index4
,而int num[2]
数组只有两个元素,num[0]
和num[1]
)。这会触发一种所谓的未定义行为,这可能导致任何结果,从返回正确的结果,到程序崩溃,再到将其销毁
编辑
添加一些见解,考虑局部变量:<代码> i>代码>代码> j <代码>,<代码> num [] /代码>和<代码> AUX <代码>。这些变量通常位于堆栈上,通常按声明(或完全相反)的顺序排列。。简单变量,如
i
或aux
可以分配到某些CPU寄存器中,但这取决于编译器的优化级别
因此变量的布局可能如下所示:
--------------------------------------------------------------
| | | | | |
... | i | j | num[0] | num[1] | aux | ...
| | | | | |
--------------------------------------------------------------
这意味着,当您到达索引超过数组长度1的num[]
数组项时,您很可能实际访问aux
变量
因此,一旦输入第三个值,实际上就将其存储在aux
中,在第一次执行
aux = num[j];
还有一个错误隐藏在内部for
循环和循环中的if
条件之间。你能发现它吗
看:
(j=0;j数量[j+1])
....
看到了吗?即使
num[]
数组有3个项目长,这也会运行到UB中,因为在上一次迭代中,您有j==2
,所以索引[j+1]
将超出范围。num只能保存2个值,您正在访问它。您有哪一个错误?您可以粘贴您的输出吗?(i=1;对于循环访问num[0]
,num[1]
,num[2]
和num[3]
,只有num[0]
和num[1]
存在;num[2]
和num[3]
不存在,因为您已将num
声明为2个int
值的数组。访问不存在的变量是未定义的行为;在这种情况下,计算机可以做任何它想做的事情,包括将太阳转化为超新星,当然,在不同的情况下给出不同的结果ting systems。请不要运行表现出未定义行为的程序,因为我真的不想让太阳变成超新星。@Bruno Dumbra只是不在win10上运行该程序。它有很多错误。:)多亏了大家,我明白了这个想法,并会更加努力……比如说一千次:)@BrunoDumbra请查看扩展答案。我知道我的数组很短,第一个“for”是获取下一个指针。我需要减少第二个“for”(j),以避免与另一个不是来自数组的值进行比较,并导致UB.Tks!!
for (j=0; j<3; j++){
if (num[j] > num[j+1])
....