C 为什么我必须写I+;在printf()部分中输入1,同时写入I++;用于递增?

C 为什么我必须写I+;在printf()部分中输入1,同时写入I++;用于递增?,c,arrays,C,Arrays,数组中的代码,处理 printf("\n How many integers? ") scanf("%d", &n); for(i = 0; i < n; i++) printf("\n Enter the %dth value : ", i+1); scanf("%d", &x[i]; printf(“\n有多少个整数?”) scanf(“%d”和“&n”); 对于(i=0;i

数组中的代码,处理

   printf("\n How many integers? ")
   scanf("%d", &n);
   for(i = 0; i < n; i++)
   printf("\n Enter the %dth value : ", i+1);
   scanf("%d", &x[i];

printf(“\n有多少个整数?”)
scanf(“%d”和“&n”);
对于(i=0;i
您可能想要:

printf("\n How many integers? ")
scanf("%d", &n);

for(i = 0; i < n; i++)
{
  printf("\n Enter the %dth value : ", i+1);
  scanf("%d", &x[i]);
}
printf(“\n有多少个整数?”)
scanf(“%d”和“&n”);
对于(i=0;i

可读性就是一切。

i++
计算为
i
的当前值,作为一种副作用,增加
i
。因此,如果在
printf
语句中使用
i++
,则每次循环迭代将增加
i
两次。您的输出将是

Enter the 0th value:
Enter the 2th value:
Enter the 4th value:
等等

在循环的中途,您将结束对数组末尾的写入

但是,正如其他人指出的,您有一个问题,您的
scanf
调用不是循环的一部分-您的代码被解释为

for ( i = 0; i < n; i++ )
{
  printf( “\nEnter the %dth value: “, i + 1 );
}
scanf( “%d”, &x[i] );
执行这些语句后,
x
的值为
1
(增量之前的
i
的值),而
i
的值为
2
。这大致相当于写入

x = i;
i = i + 1;
x = i + 1;
i = i + 1;
除了
i
只计算一次,并且指定
x
和更新
i
的确切顺序未指定。编译器可以在将
i
的旧值指定给
x
之前生成更新
i
的代码:

mov i, %eax    ;; assign i to a temporary
inc i          ;; increment i
mov %eax, x    ;; assign the temporary to x
当然,这将更直接地生成

mov i, x
inc i
但也许有理由用另一种方式来做

重要的是最终结果-
x
在增量之前获取
i
的值,并且
i
是递增的

++i
计算为
i+1
,其副作用是增加
i

i = 1;
x = ++i;
然后在执行这些语句之后,
x
i
的值都是2。这类似于写入

x = i;
i = i + 1;
x = i + 1;
i = i + 1;
与上面相同的注意事项-指定
x
和更新
i
的顺序未指定,编译器完全可以生成如下代码:

mov i, %eax   ;; assign i to a temporary
inc %eax      ;; increment the temporary
mov %eax, x   ;; assign the temporary to x
inc i         ;; increment i
即使像

inc i
mov i, x
会更直接

同样,重要的是
x
获取
i+1
的值,并且
i
是递增的

另外,到目前为止(在我学习C的过程中),我只看到I++在1的步骤中递增。所以,我不知道在这种情况下它是如何递增到2的。那么,I+1有什么不同之处来阻止它呢

您的问题标题询问您为什么应该在打印语句中使用
i+1
而不是
i++
。假设您编写了

for(i = 0; i < n; i++)
{
   printf("\n Enter the %dth value : ", i++);
   ...
}
(i=0;i { printf(“\n输入%dth值:”,i++); ... }
如果您是这样编写代码的,那么
i
将在每个循环迭代中更新两次,这不是您想要的。您不想在
printf
调用中修改
i
i++
(和
++i
--i
,和
i--
)所有修改
i
的值
i+1
不会修改
i

的值,因为
i++
i+1
不一样,不一样,不一样

  • i+1
    获取
    i
    的值并向其添加1,然后为您提供新值

  • 另一方面,
    i++
    则获取
    i
    的新值,并向其添加1,然后将新结果存储回
    i
    。同时,它还将提供旧值

  • 然后是
    ++i
    ,它获取
    i
    的新值,并向其中添加1,然后将新结果存储回
    i
    ,并给出新值

  • 最后,我们有
    i=i+1
    i+=1
    ,这两个函数都取
    i
    的新值,加上1,并将新结果存储回
    i
    中,然后给您新值,即,这两个函数或多或少都相当于
    +i

因此,如果您想打印一个以上的
i
,但不更改
i
的值,那么像
printf(“输入%dth值:”,i+1)
这样的调用正是您想要的


你说你被告知它“递增
i
”,但你必须清楚你认为“递增”是什么意思。它的意思是“取
i
的值并加上1,然后给你结果”,还是说“取
i
的值并加上1,然后将结果存储回
i
”正如你所看到的,这是两件截然不同的事情。

因为
i++
返回的值与
i+1
的值不同(不同于
++i
),还因为它会再次增加
i
,所以在循环中会增加两次。如果在
printf()中使用
i++
同样,对于循环的每一次迭代,
i
将被校正两次,因为
i+1
传递给
printf
并不是为了增加
i
@Quentin,更糟糕的是:它读取一个超出范围元素的数据。他们试图说的是你应该使用{}在每次for循环之后,你应该缩进你的代码,这样你自己和其他人都可以阅读。一旦你修复了它,很容易发现错误。亲爱的@John Bode先生,如果你能告诉我I++的计算结果,然后增加1,我将不胜感激。此外,到目前为止(在我学习C的过程中),我只看到I++以1的步骤递增。因此,我不知道在这种情况下它如何递增到2。而且,I+1与阻止它有什么不同?先生,我衷心感谢您抽出宝贵的时间为我提供这一详细的解释。更好地理解这个问题有助于/有助于