可能是重复问题:
C++中的增量 - 何时使用x++或++x?
我经常在for循环等地方看到i++
这样的代码。但当人们用--
代替++
时,一些人会倾向于写成--i
而不是i--
。
在我上次查看时,它们都可以工作(至少在JavaScript中)。请问在其他C系列语言中是否也是这样,并且如果是,为什么有些人更喜欢--i
而不是i--
?
可能是重复问题:
C++中的增量 - 何时使用x++或++x?
我经常在for循环等地方看到i++
这样的代码。但当人们用--
代替++
时,一些人会倾向于写成--i
而不是i--
。
在我上次查看时,它们都可以工作(至少在JavaScript中)。请问在其他C系列语言中是否也是这样,并且如果是,为什么有些人更喜欢--i
而不是i--
?
++i
比i++
快。为什么?看一下简单的解释。
i++
会将i的值增加1,但返回未增加前的值。
temp = i
temp
示例:
i = 1;
j = i++;
(i is 2, j is 1)
++i
会将i的值加1,然后返回递增后的值。
示例:
i = 1;
j = ++i;
(i is 2, j is 2)
这与 --i
和 i--
相似。
i++
而不是 --i
呢?这就是问题所在。 - Bo Perssoniinc / iload_1
与iload_1 / iinc
。当然,JIT可能会介入。但是,由于我更喜欢前缀...;-) - T.J. Crowder历史上,增量/减量运算符是由堆栈管理所激发的。当您将一个元素推入堆栈时:
*(stackptr++) = value
当你弹出:
value = *(--stackptr)
(这些被转换为单个ASM指令)
因此,我们习惯于后增和前减。
在直接和反向顺序填充中,您可以看到另一个惯用的例子:
for (p=begin;p!=end;)
*(p++) = 42;
for (p=end;p!=begin;)
*(--p) = 42;
我不认为使用前缀 (++i
) 或后缀 (i++
) 取决于是增量还是减量。
至于为什么,我喜欢在可能的情况下使用前缀,因为我的母语是英语,它通常具有动词-宾语结构(“吃晚饭”,“开车”),所以“增加i”或“减少i”对我来说比“i减少”更自然。当然,如果我需要在表达式中使用结果并且需要增量之前的值 (而不是增量后的值),我会愉快地使用后缀。
++i
")将在增加i
的值之后返回该值,并且后置增量 ("i++
")将在增加前返回该值。因此,如果i
是一种复杂类型,它已经重载了前置和后置增量运算符,则前置增量运算符可以直接返回该对象,而后置增量运算符则必须返回该对象的副本,如果该对象很大,则效率可能会较低。在大多数情况下(例如循环增量等),这个值都被忽略了,所以这只是一个偏好问题,大部分时间不会有问题。++
和--
运算符都有前缀形式:++i
和--i
,以及后缀形式:i++
和i--
。前者意味着先计算再使用,后者意味着先使用再计算。只有当其中一种形式作为表达式的一部分时,这种差异才是相关的。否则,这只是偏好或风格(或缺乏风格)的问题。int i = 0; int n = ++i;
中,i
首先被增加,然后其值,现在是1,被赋给n
。在n = i++
中,i
的值仍然是1,被赋给n
,然后被增加,现在i == 2
。i++; ++i;
两种形式是等价的。i++
替换为++i
来进行优化。如果它不执行此优化,则可能会在性能上产生(非常小的)差异。然而,对于具有重载operator ++
的用户定义类型,这种优化是不允许的(因为编译器无法保证您已经正确实现了两个操作符之间的预期关系)。这意味着,在C++中选择哪种形式实际上会影响结果。 - Agentlienint x;
int y;
// Increment operators
x = 1;
y = ++x; // x is now 2, y is also 2
y = x++; // x is now 3, y is 2
// Decrement operators
x = 3;
y = x--; // x is now 2, y is 3
y = --x; // x is now 1, y is also 1