为什么人们写--i?

时间:2013-01-27 10:16:38

标签: java javascript c++ language-agnostic operators

  

可能重复:
  Incrementing in C++ - When to use x++ or ++x?

我见过像i++循环中常用的for之类的东西。但是,当人们使用--代替++时,由于某些原因,有些人倾向于写--i而不是i--

上次检查时,它们都有效(至少在JavaScript中)。有人可以告诉我其他C系列语言是否也是这样,如果是,为什么有些人更喜欢--ii--

6 个答案:

答案 0 :(得分:12)

++ii++快。为什么?请参阅简单说明。

i ++在

i++将增加i的值,但返回预先递增的值。

  • temp = i
  • i递增
  • temp已退回

示例:

i = 1;
j = i++;
(i is 2, j is 1)

++ i的

++i将增加i的值,然后返回递增的值。

示例:

i = 1;
j = ++i;
(i is 2, j is 2)

这是--ii--的相似内容。

答案 1 :(得分:5)

我不相信前缀(++i)与后缀(i++)的偏好取决于它是增量还是减量。

至于为什么,我更喜欢可能的前缀,因为我的母语是英语,主要是一个动词在对象之前的结构("吃晚餐",&#34 ;开车"),所以"增加i"或者"递减i"对我来说比#34; i减少"更自然。当然,如果我使用结果并且我需要值 previous 到表达式中的增量(而不是递增的值),我会很乐意使用postfix。

答案 2 :(得分:5)

历史上,递增/递减运算符是由堆栈管理驱动的。当你在堆栈上推送一个元素时:

*(stackptr++) = value
弹出时

value = *(--stackptr)

(这些转换为单个ASM指令)

因此,人们习惯于在之前和之后递增。

您可以在填写直接和反向顺序时看到另一个惯用示例:

for (p=begin;p!=end;) 
    *(p++) = 42;

for (p=end;p!=begin;) 
    *(--p) = 42;

答案 3 :(得分:4)

这几乎是一个偏好的东西,只有在对比原语更复杂的类型进行预增量或后增量时才会发挥作用。

预递增(“++i”)在递增后返回i 的值,并且后递增(“i++”)在增量之前返回值。因此,如果i是一个复杂的类型,它重载了预增量和后增量运算符,则预增量运算符只能返回对象,而后增量则必须返回一个副本。对象,如果对象很大,效率可能会降低。在大多数情况下(对于循环增量等),无论如何都会忽略该值。

像我说的那样,大部分时间,不是问题,只是偏好。

答案 4 :(得分:2)

在C和C ++中,++--运算符都有前缀形式:++i--i,后缀形式为:i++和{{1 }}。前者意味着评估然后使用,后者意味着使用然后评估。只有当任一表单用作表达式的一部分时,差异才有意义。否则,这是一个偏好或风格(或缺乏)的问题。

F.ex。,在i--中,int i = 0; int n = ++i;首先递增,然后将其值(现在为1)分配给in n = i++的{​​{1}}值,仍为1,分配给i,然后递增,现在为n

当用作语句时,即:i == 2两种形式都是等效的。

答案 5 :(得分:1)

差异是预递增或后递增(同样随着递减)。

引用显示为“c减量”的第二个Google结果主题的Wikipedia article

int  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

因此,这不是一个偏好问题,而是结果的差异。