当++ i“可以”在c ++中更快时,我的观点是什么?

时间:2013-08-31 14:04:53

标签: c++ optimization

我一直在阅读有关C ++中++ 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?如果有,请解释。感谢

4 个答案:

答案 0 :(得分:2)

以下是一个例子:

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

这会将数字1打印到10。如果您使用++i,则会将1打印到9

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

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循环中,没有区别,因为执行增量并且然后检查条件。两者之间的唯一区别是实际表达式的值。

答案 1 :(得分:1)

如果您希望在递增之前获取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,请使用{{1}}。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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

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