我感兴趣的是for
和while
循环之间的区别。我知道使用后增量值然后递增,操作返回一个恒定的预增量。
while (true) {
//...
i++;
int j = i;
}
此处,j
会在循环结束时包含旧的i
或后递增的i
吗?
答案 0 :(得分:43)
由于i ++语句在您的示例中以;
结束,因此无论是使用前增量还是后增量都没有区别。
使用结果时会出现差异:
int j = i++; // i will contain i_old + 1, j will contain the i_old.
Vs的:
int j = ++i; // i and j will both contain i_old + 1.
答案 1 :(得分:36)
取决于您如何使用它们。
i++
制作副本,增加i,然后返回副本(旧值)。++i
增加i,然后返回i。在你的例子中,它与速度有关。 <{1}}将比++i
更快,因为它不会复制。
然而,编译器可能会对其进行优化,因为您没有在示例中存储增量运算符的返回值,但这仅适用于i++
等基本类型。
答案 2 :(得分:21)
理解的基本答案。 增量运算符的工作方式如下:
// ++i
function pre_increment(i) {
i += 1;
return i;
}
// i++
function post_increment(i) {
copy = i;
i += 1;
return copy;
}
一个好的编译器会在检测到不会使用返回值时自动将i++
替换为++i
。
答案 3 :(得分:6)
在预增量中,首先递增初始值,然后在表达式中使用。
a=++i;
在此示例中,假设变量i
的值为5,则变量a
的值将为6,因为i
的值在表达式中使用之前会被修改。 / p>
在Post-Increment中,首先在表达式中使用值,然后递增。
a=i++;
在此示例中,假设变量i
的值为5,则变量a
的值将为5,因为i
的值仅在将值5分配给{{后才会增加1}}。
答案 4 :(得分:4)
#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来跟随前一个语句。
答案 5 :(得分:2)
i ++使用i的值然后递增它但++ i在使用之前递增i的值。
答案 6 :(得分:0)
后增量和增量之间的差异实际上在许多情况下是微妙的。 post incremenet,又名num++
,首先创建num
的副本,返回它,,然后,递增它。另一方面,预增量又名++num
,首先计算,然后返回值。大多数现代编译器在循环中看到它时,通常会优化,主要是在使用后增量时,并且不使用返回的初始值。 2个增量之间最重要的区别是,在通常会产生细微的错误时,是在声明变量时使用递增的值:示例如下:
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
,它并不总是有效,并且相当于预增量)。如果使用正确的增量,将会节省很多麻烦。
答案 7 :(得分:0)
在独立的语句中使用前置或后置增量并不重要,除了前置增量是立即生效的
//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