周期中的前递增和后递增(对于/同时)有什么区别
What is the difference between pre-increment and post-increment in the cycle (for/while)?
我的兴趣在于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,因为只有在将值 5 分配给 a
后,i
的值才会递增。
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argp)
{
int x = 5;
printf("x=%dn", ++x);
printf("x=%dn", x++);
printf("x=%dn", x);
return EXIT_SUCCESS;
}
程序输出:
x=6
x=6
x=7
在第一个 printf 语句中,x 在传递给 printf 之前递增,因此输出值 6,在第二个 x 中传递给 printf(因此输出 6(然后递增,第三个 printf 语句只是通过再次输出 x 来显示前一条语句之后的后递增,现在的值为 7。
i++ 使用 i 的值然后递增它,但 ++i 在使用之前递增 i 的值。
在许多情况下,后递增和前递增之间的区别确实很微妙。 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
,这并不总是有效,相当于预增量(。如果您使用正确的增量,将节省很多麻烦。
独立语句中使用前递增还是后递增并不重要,除了前递增效果是立竿见影的
//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
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 如何在linux终端中同时编译和运行c++代码
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 同时具有"聚合初始化"和"模板推导"
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 是否可以使用winusb同时与多个相同的usb设备进行通信
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 返回递归调用和仅递归调用的区别
- 维护unordered_map但同时每一步都需要最低的映射值
- 是否可以同时声明一个类成员的常量/非常量?
- 如果和同时中断之间的区别
- 周期中的前递增和后递增(对于/同时)有什么区别