4

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

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

无论如何,我怎么理解这一点?

4

7 回答 7

11
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这三个语句中的任何一个之后的值都是相同的。

于 2013-08-24T16:15:43.437 回答
5

解决方案的意思是说没有区别,无论发生什么,无论表达式的上下文如何,++i都具有相同的含义。周围的括号确保即使上下文包含进一步的算术,等价也成立,例如等价于,但不等于(等价于)。(i += 1)ii += 1++i * 3(i += 1) * 3i += 1 * 3i += 3

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

于 2013-08-24T16:12:20.010 回答
1

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

通常 i+= 仅在增量不是 1 时才在这些情况下使用。将其用于正常增量不会有危险,但会导致理解上的轻微障碍并使代码看起来不寻常。

于 2013-08-24T19:48:58.757 回答
1

两者之间的区别是: ++ 是一元运算符,而 + 是二元运算符.... 如果我们考虑执行时间: i++ is more faster than i=i+1. 执行同一组代码的机器周期数不同,这就是为什么总是首选 ++ 运算符循环。 有关更多信息,请参阅此线程

于 2017-03-04T18:38:50.550 回答
0

++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 */
于 2013-08-24T16:12:49.050 回答
0

我认为它们完全一样。有一件事可能很有趣。++i 等于 (i+=1) 但不等于 i+=1;不同之处在于支架。因为 i += 1 可能取决于上下文并且会有不同的解释。

于 2013-08-24T16:28:34.260 回答
0

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

++我和我++

增加1中的变量。在伪汇编中,这两个代码都是:

inc i

但是如果您分配值,则 ++ 的顺序是相关的:

x = i++

生产:

mov x, i
inc i

x = ++i

生产:

inc i
mov x, i

在这种情况下:i += 1

它将产生:

add i,1

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

inc i
于 2013-08-24T19:37:47.917 回答