for
我的兴趣在于和while
循环之间的区别。我知道使用后增量值然后递增,并且操作返回一个常量前增量。
while (true) {
//...
i++;
int j = i;
}
在这里,将包含循环结束时的j
旧i
增量或后增量?i
for
我的兴趣在于和while
循环之间的区别。我知道使用后增量值然后递增,并且操作返回一个常量前增量。
while (true) {
//...
i++;
int j = i;
}
在这里,将包含循环结束时的j
旧i
增量或后增量?i
由于语句 i++;
在您的示例中结束,因此无论您使用前增量还是后增量都没有区别。
当您使用结果时会出现差异:
int j = i++; // i will contain i_old + 1, j will contain the i_old.
对比:
int j = ++i; // i and j will both contain i_old + 1.
取决于你如何使用它们。
i++
制作一个副本,增加 i,并返回副本(旧值)。++i
增加 i,并返回 i。在您的示例中,这完全与速度有关。++i
会比i++
因为它不制作副本要快。
但是,编译器可能会将其优化掉,因为您没有在示例中存储增量运算符的返回值,但这仅适用于基本类型,如int
.
理解的基本答案。递增运算符的工作方式如下:
// ++i
function pre_increment(i) {
i += 1;
return i;
}
// i++
function post_increment(i) {
copy = i;
i += 1;
return copy;
}
当一个好的编译器检测到返回的值不会被使用时,它i++
会自动替换为。++i
在预增量中,初始值首先递增,然后在表达式中使用。
a = ++i;
在此示例中,假设变量的i
值为 5。那么变量的值a
将是 6,因为在i
表达式中使用它之前会修改 的值。
在后增量中,值首先在表达式中使用,然后递增。
a = i++;
在此示例中,假设变量的i
值为 5。那么变量的值a
将是 5,因为i
只有在将值 5 分配给 后才会增加 的值a
。
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argp)
{
int x = 5;
printf("x=%d\n", ++x);
printf("x=%d\n", x++);
printf("x=%d\n", x);
return EXIT_SUCCESS;
}
程序输出:
x=6
x=6
x=7
在第一个 printf 语句中,x 在传递给 printf 之前递增,因此输出值 6,在第二个 x 传递给 printf(所以输出 6)然后递增,第三个 printf 语句仅显示前一个后递增通过再次输出 x 现在的值 7 来声明。
i++ 使用 i 的值然后递增它,但 ++i 在使用它之前递增 i 的值。
在独立语句中使用前置增量还是后置增量都没有关系,除了前置增量,效果是即时的
//an example will make it more clear:
int n=1;
printf("%d",n);
printf("%d",++n);// try changing it to n++(you'll get to know what's going on)
n++;
printf("%d",n);
输出:123
在许多情况下,后增量和前增量之间的差异确实很微妙。post incremenet,又名num++
,首先创建 的副本num
,将其返回,然后将其递增。另一方面,预增量 aka ++num
,首先计算,然后返回值。大多数现代编译器,当在循环中看到这一点时,通常会优化,主要是在使用后增量时,并且不使用返回的初始值。两个增量之间的最大区别(通常会产生细微的错误)是在声明具有增量值的变量时:示例如下:
int num = 5;
int num2 = ++num; //Here, first num is incremented,
//then made 6, and that value is stored in num2;
另一个例子:
int num = 5;
int num2 = num++; //Here, num is first returned, (unfortunately?), and then
//incremented. This is useful for some cases.
我想说的最后一件事是小心增量。声明变量时,请确保使用正确的增量,或者只写出整个内容(num2 = num + 1
这并不总是有效,相当于预增量)。如果您使用正确的增量,将会省去很多麻烦。