0

在我看来,这

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

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

不应该做同样的事情。对于第二个示例,自循环开始以来 i 应该等于 1 对我来说更符合逻辑。

4

7 回答 7

4

在一些处理器上,例如 PDP-11、VAX-11 和 68K,有些指令的模式与*ptr++和等效*--ptr。根据编写代码的确切方式,编译器可能会也可能不会容易地利用这些指令 - 因此,使用*++ptror *ptr++[哪个更好取决于实际循环中的用法]的“正确”变体在这些特定情况下,循环内部可以对性能产生相当大的影响。然而,对于 ARM 和 x86(我认为是 PowerPC 和 MIPS,因此几乎涵盖了所有现代处理器),这种类型的构造无论如何都不是指令集的一部分,而且编译器现在比以前聪明多了,比如说,10 或 20 年前。

任何合理的编译器都会对基本类型做同样的事情,i++or++i不是问题。

如果我们有一个“复杂”的类型,例如带有 的结构或类operator++(int),并且opterator++()可能存在微小差异[或在极端情况下,差异很大],因为必须复制对象。假设我们有一个bigmath类,我们i的值是 1000 位长。现在我们必须在增量的中间制作一个(n 个额外的)1000 位数字的副本。如果编译器能够“理解”正在发生的事情,它可能会忽略该副本,但不能保证会发生。

于 2013-06-03T23:46:48.563 回答
3

在我看来,他们应该做同样的事情。两者都有递增的效果i

唯一的区别是表达式的i++给出增量前的值,并++i给出增量后的值。但在这种情况下,该值被丢弃,表达式仅评估其副作用;所以代码的效果没有区别。

在某些情况下(如果i不是int某些用户定义的类型,其重载运算符过于复杂,编译器无法理解),++i可能会更有效。那是因为i++需要复制来返回旧值,而++i只需要返回对新值的引用。而且,当然,一个足够疯狂的用户定义类型可以使两个重载做完全不同的事情。但是对于简单类型,那里也没有区别。

于 2013-06-03T23:22:39.907 回答
2

在您的示例中:没有区别。如果类型是用户定义的类型,则可能会有很大差异。

至于哪个更合乎逻辑,当然是一个值得商榷的问题。建议您按照团队的风格或适合您的任何工作。

于 2013-06-03T23:26:36.053 回答
2

尽管在考虑返回值时具有不同的功能,但在几乎所有情况下,编译器都会优化++ifor for循环。i++i++++i

如果您不知道有什么区别,那就是++i先递增然后返回 new 的值i,而i++先递增然后返回 old 的值i。前者在技术上更有效,因为您不必存储中间值,但总的来说,除非您尝试编写代码高尔夫并使用返回值,否则它们实际上并没有太大区别。

于 2013-06-03T23:31:10.333 回答
1

在您的上下文中,它是相同的。++i和之间的区别在于i++操作的顺序。如果你是一个疯狂邪恶的 C 程序员,你可能会编写如下代码:

int i = 3;
if( ++i++ == 4 ) 
    printf( "%d\n", i);

这将输出

5

因为在 if 测试期间我是 4,但在测试后立即是 5。

但不要那样做。

于 2013-06-03T23:24:05.913 回答
0

在我的第一学期,我的讲师煞费苦心地向全班解释了这一点。据我回忆,我很确定它的来龙去脉主要与“返回”值有关,例如:

++i 将递增 i 的值,并返回递增后的值,直到操作完成,而 i++ 虽然也会递增该值,但如果在操作期间调用该变量,它将返回未递增的值。

所以如果你有这个:

a = 1;
b = ++a;
c = 10;
d = c++;

那么值将是

a = 2
b = 2
c = 11
d = 10

(d 是因为 c 已经返回了 'post' ++'s 而不是通常的 'pre' ++'s)。

在循环中它绝对没有区别,因为增量在循环语句中而不是在它之后的操作中。唯一会有所作为的是

for(i = 0; i<5;)
    printf("%d ",++i);

其中 0 值不会被打印,而 5 值将是,因为它在打印操作期间递增。

清如泥吧??不要问我为什么这已经被编程到 C 中了!在我看来,这似乎是多余的,并且很少会弹出任何需要它的程序可以通过一行额外的代码改变不同变量中的值来解决问题!

于 2013-06-03T23:52:48.343 回答
0

在你的情况下是一样的,因为你的表达式的返回值没有被使用。

于 2013-06-04T14:43:23.450 回答