我见过像循环i++
中常用的东西。for
但是当人们使用--
代替时++
,出于某种原因,有些人倾向于写--i
为反对i--
。
上次我检查时,它们都可以工作(至少在 JavaScript 中)。有人可以告诉我在其他 C 系列语言中是否如此,如果是,为什么有些人更--i
喜欢i--
?
我见过像循环i++
中常用的东西。for
但是当人们使用--
代替时++
,出于某种原因,有些人倾向于写--i
为反对i--
。
上次我检查时,它们都可以工作(至少在 JavaScript 中)。有人可以告诉我在其他 C 系列语言中是否如此,如果是,为什么有些人更--i
喜欢i--
?
++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--
。
我不相信前缀 ( ++i
) 与后缀 ( i++
) 的偏好会根据它是递增还是递减而有所不同。
至于为什么,我尽可能选择前缀,因为我的母语是英语,它主要是动词前宾语结构(“吃晚餐”,“开车”),所以“增量i
”或“减量i
”更自然我比“i
减量”。当然,如果我使用结果并且我需要表达式中增量之前的值(而不是增量值),我会很乐意使用后缀。
从历史上看,递增/递减运算符是由堆栈管理驱动的。当您将元素压入堆栈时:
*(stackptr++) = value
当你弹出:
value = *(--stackptr)
(这些被转换为单个 ASM 指令)
因此,人们习惯于先递增后递减。
您可以看到另一个直接和反向填充的惯用示例:
for (p=begin;p!=end;)
*(p++) = 42;
for (p=end;p!=begin;)
*(--p) = 42;
这几乎是一种偏好,只有在您对比原语更复杂的类型进行预增量或后增量时才会发挥作用。
前增量(“ ++i
”)返回增量后的值,i
后增量(“ ”)返回增量前i++
的值。因此,如果是重载了前自增和后自增运算符的复杂类型,则前自增运算符可以只返回对象,而后自增必须返回对象的副本,这很可能如果对象是实质性的,则效率会降低。在大多数情况下(for循环增量等),无论如何都会忽略该值。i
就像我说的,大多数时候,这不是问题,只是偏好。
在 C 和 C++ 中,++
和--
运算符都有前缀形式:++i
and--i
和后缀形式:i++
and i--
。前者意味着评估然后使用,后者意味着使用然后评估。仅当任一形式用作表达式的一部分时,差异才有意义。否则,这是偏好或风格(或缺乏)的问题。
F.ex., in int i = 0; int n = ++i;
,i
首先递增,然后将其值(现在为 1)分配给n
。在n = i++
的值中i
,仍然是 1,被分配给n
然后递增,i == 2
现在。
当用作语句时,即:i++; ++i;
两种形式是等价的。
区别在于预递增或后递增(同样还有递减)。
引用关于“c 减量”的第二个谷歌结果的主题的维基百科文章:
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
因此,与其说是偏好问题,不如说是结果差异的问题。