当 ++i“可以”在 c++ 中更快时,i++ 的意义何在? [复制]

Posted

技术标签:

【中文标题】当 ++i“可以”在 c++ 中更快时,i++ 的意义何在? [复制]【英文标题】:Whats the point of i++ when ++i "can" be faster in c++? [duplicate] 【发布时间】:2013-09-04 03:10:42 【问题描述】:

我已经阅读了很多关于 C++ 中 ++i 和 i++ 的微优化的帖子/问题。而且据我所知,++i“可以”,并非总是如此,但可以比 i++ 更快。

所以这让我问这个问题,那么 i++ 的意义何在?我认为 ++i 是你先增加值然后返回它。在 i++ 中,您返回值然后递增它。但是我对此做了一个非常简单的测试:

for(int i = 0; i < 10; ++i)

    std::cout << i << std::endl;

等同于:

for(int i = 0; i < 10; i++)

    std::cout << i << std::endl;

两者都打印出相同的结果。所以我真正的问题是,是否存在您必须使用 i++ 而不是 ++i 的情况?如果有,请解释。谢谢

【问题讨论】:

您在示例中使用它的方式是任意的,没关系,当您需要预先递增/递减或后递增/递减时,您必须选择一个而不是另一个(- -len)某事。当然,这与速度无关,速度是一个完全独立的话题。您还没有真正解决问题中的速度问题。 在您的示例中,您忽略(丢弃)++ii++ 的结果,仅使用它们的副作用。如果您要丢弃结果,那么两者当然是等价的。但是,我们并不总是丢弃表达式的结果。 ++ii++ 的结果是不同的,所以在你关心这些结果的情况下,你可以使用适合你的目的。 【参考方案1】:

不应该存在您必须使用后缀或前缀版本的可行正常情况。每个版本都可以产生相同的功能效果。

前缀运算符可以更快,但编译器无论如何都会执行优化,并且会比手动尝试做得更好。

主要区别在于代码的可读性和简单性 - 请参阅其他答案中的示例 - 在某些情况下,前缀/后缀比其他版本更方便。

所有这些都与 C 和 C++ 相关。由于 C++ 允许您重载运算符,因此您可以为这些运算符中的每一个提供不同的功能,在这种情况下,上述声明不成立。但是应该注意,编写这样的代码可能是一个非常糟糕的主意。

【讨论】:

【参考方案2】:

如果您想在递增之前获取(例如打印)i,请使用 i++,例如:

for(int i = 0; i < 10; i++)

    std::cout << "old i = " << i++ << std::endl;
    std::cout << "new i = " << i << std::endl;

如果要打印已递增的i,请使用++i

【讨论】:

【参考方案3】:

这是一个例子:

int i = 0;
while (i++ < 10) 
    std::cout << i << std::endl;

这将打印数字110。如果您使用++i,它将打印19

当然,这是一个简单的示例,因为还有其他方法可以做到这一点,但重点是 i++ 将返回 old 值。如需进一步说明:

int i = 5;
std::cout << i++ << std::endl; // 5
std::cout << i << std::endl;   // 6

std::cout << ++i << std::endl; // 7
std::cout << i << std::endl;   // 7

for 循环中,没有区别,因为执行了增量并且然后检查了条件。两者之间的唯一区别是实际表达式的值。

【讨论】:

【参考方案4】:

有时您想先使用该值,然后再递增,例如

while (array[i++] != sentinel)

【讨论】:

以上是关于当 ++i“可以”在 c++ 中更快时,i++ 的意义何在? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

函数参数的扩展

使用 C++ 保存的文件未显示在目录中

如何在 C++ 应用程序中模拟高存储活动

数组如何在 C++ 的内存中存储字符串?

2022-10-05:在一个 n x n 的整数矩阵 grid 中, 每一个方格的值 grid[i][j] 表示位置 (i, j) 的平台高度。 当开始下雨时,在时间为 t 时,水池中的水位为 t 。

İ 可以使用 JavaScript 更改我在托管中的文件吗?