从任何观点来看,++ i和i + = 1之间的区别是什么

这是来自kn king的c编程的一个问题:一种现代的方法。 我无法理解他给出的解决方案: –

The expression ++i is equivalent to (i += 1). The value of both expressions is i after the increment has been performed. 

我怎么理解这个呢?

 i = 10 printf("%d", i++); 

将打印10,在哪里

 printf("%d", ++i); 

将打印11

X = i++可以这样认为

 X = i i = i + 1 

其中X = ++i

 i = i + 1 X = i 

所以,

 printf ("%d", ++i); 

和…一样

 printf ("%d", i += 1); 

但不是

 printf ("%d", i++); 

虽然这三个陈述中的任何一个之后的i值都是相同的。

解决方案意味着没有区别, ++i具有与(i += 1)相同的含义,无论i碰巧是什么,无论表达的上下文如何。 围绕i += 1的括号确保即使当上下文包含更多算术时等价也成立,例如++i * 3等价于(i += 1) * 3 ,但不等于i += 1 * 3 (这相当于i += 3 )。

这同样适用于i++ ,它具有相同的副作用(递增i ),但周围表达式中的值不同 – 在递增之前的i值。

到目前为止尚未提出的一个区别是代码的可读性。 大部分循环使用递增1,通常的做法是在移动到下一个元素/将索引递增1时使用i ++ / ++ i。

通常情况下,i + =仅在增量为1以外的情况下使用。使用此值进行正常增量不会有危险,但会导致理解上的轻微影响并使代码看起来exception。

我认为它们完全一样。 有一件事可能很有趣。 ++ i等于(i + = 1)但不是i + = 1; 不同的是支撑。 因为i + = 1可能取决于上下文,它将有不同的解释。

在没有分配的正常操作中:

++ i和i ++

增加1中的变量。在伪程序集中,两个代码都是:

 inc i 

但如果您指定值,则++的顺序是相关的:

x = i ++

生产:

 mov x, i inc i 

x = ++ i

生产:

 inc i mov x, i 

在:i + = 1的情况下

它会产生:

 add i,1 

但是因为编译器优化了代码,所以在这种情况下它也会产生:

 inc i 

两者之间的区别是: ++是一元运算符而+是二元运算符…. 如果我们考虑执行时间: i++ is more faster than i=i+1. 执行同一组代码的机器周期不同,这就是++运算符总是优先于循环的原因。 有关详细信息,请参阅此主题

++i是预增量运算符。 它在设置和返回值之前递增i (显然是i + 1 )。

现在, i++是后增量运算符。 它会在评估出现的整个指令后递增i

例:

 int i = 0; std::cout << ++i << std::endl; /* you get 1 here */ std::cout << i++ << std::endl; /* you still get 1 here */ std::cout << i << std::endl; /* you get 2 here */