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

时间:2013-08-24 16:06:31

标签: c operators

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

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

我怎么理解这个呢?

7 个答案:

答案 0 :(得分:7)

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的值都是相同的。

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

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

通常情况下i + =仅在增量为1以外的情况下使用。将其用于正常增量不会有危险,但会导致理解上的轻微颠簸并使代码看起来不寻常。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

++ 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

答案 5 :(得分:0)

两者之间的区别是: ++是一元运算符,而+是二元运算符.... 如果我们考虑执行时间: i++ is more faster than i=i+1. 执行同一组代码的机器周期不同,这就是++运算符总是优先用于循环的原因。 Refer to this thread for more info

答案 6 :(得分:-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 */