我见过像i++
循环中常用的for
之类的东西。但是,当人们使用--
代替++
时,由于某些原因,有些人倾向于写--i
而不是i--
。
上次检查时,它们都有效(至少在JavaScript中)。有人可以告诉我其他C系列语言是否也是这样,如果是,为什么有些人更喜欢--i
到i--
?
答案 0 :(得分:12)
++i
比i++
快。为什么?请参阅简单说明。
i++
将增加i的值,但返回预先递增的值。
temp = i
i
递增temp
已退回示例:
i = 1;
j = i++;
(i is 2, j is 1)
++i
将增加i的值,然后返回递增的值。
示例:
i = 1;
j = ++i;
(i is 2, j is 2)
这是--i
和i--
的相似内容。
答案 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)分配给i
。 n
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
因此,这不是一个偏好问题,而是结果的差异。