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
的值并向其添加1,然后为您提供新值i
- 另一方面,
则获取i++
的新值,并向其添加1,然后将新结果存储回i
。同时,它还将提供旧值i
- 然后是
,它获取++i
的新值,并向其中添加1,然后将新结果存储回i
,并给出新值i
- 最后,我们有
和i=i+1
,这两个函数都取i+=1
的新值,加上1,并将新结果存储回i
中,然后给您新值,即,这两个函数或多或少都相当于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与阻止它有什么不同?先生,我衷心感谢您抽出宝贵的时间为我提供这一详细的解释。更好地理解这个问题有助于/有助于