Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';不理解递减/递增'的逻辑;对于';在C中_C - Fatal编程技术网

Can';不理解递减/递增'的逻辑;对于';在C中

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

我编写了这个代码,当我在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++)
  {
      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中都不起作用。获得正确的结果纯粹是运气使然,因为您访问的内存超过了声明数组的末尾(第一对循环使用index
2
,最后一个循环迭代到index
4
,而
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])
           ....