当 ++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)某事。当然,这与速度无关,速度是一个完全独立的话题。您还没有真正解决问题中的速度问题。 在您的示例中,您忽略(丢弃)++i
和 i++
的结果,仅使用它们的副作用。如果您要丢弃结果,那么两者当然是等价的。但是,我们并不总是丢弃表达式的结果。 ++i
和 i++
的结果是不同的,所以在你关心这些结果的情况下,你可以使用适合你的目的。
【参考方案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;
这将打印数字1
到10
。如果您使用++i
,它将打印1
到9
。
当然,这是一个简单的示例,因为还有其他方法可以做到这一点,但重点是 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++ 的意义何在? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
2022-10-05:在一个 n x n 的整数矩阵 grid 中, 每一个方格的值 grid[i][j] 表示位置 (i, j) 的平台高度。 当开始下雨时,在时间为 t 时,水池中的水位为 t 。