Java 为什么人们写我?

Java 为什么人们写我?,java,javascript,c++,language-agnostic,operators,Java,Javascript,C++,Language Agnostic,Operators,可能重复: 我见过像I++这样的东西,常用于,比如说,for循环。但是当人们使用--而不是++时,出于某种原因,有些人倾向于编写--i,而不是i-- 上次我检查时,它们都工作(至少在JavaScript中)。有人能告诉我在其他C族语言中是否是这样吗?如果是,为什么有些人更喜欢--i而不是i--?区别是递增前还是递增后(递减也是如此) 引用“c减量”的第二个谷歌搜索结果的主题: 因此,与其说是偏好的问题,不如说是结果的差异。++i比i++快。为什么?参见简单的解释 我++ i++将增加i的值,但

可能重复:

我见过像
I++
这样的东西,常用于,比如说,
for
循环。但是当人们使用
--
而不是
++
时,出于某种原因,有些人倾向于编写
--i
,而不是
i--


上次我检查时,它们都工作(至少在JavaScript中)。有人能告诉我在其他C族语言中是否是这样吗?如果是,为什么有些人更喜欢
--i
而不是
i--

区别是递增前还是递增后(递减也是如此)

引用“c减量”的第二个谷歌搜索结果的主题:


因此,与其说是偏好的问题,不如说是结果的差异。

++i
i++
快。为什么?参见简单的解释

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

  • temp=i
  • i
    是递增的
  • temp
    返回
例如:

i = 1;
j = i++;
(i is 2, j is 1)
i = 1;
j = ++i;
(i is 2, j is 2)
++我
++i
将增加i的值,然后返回增加的值

例如:

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

这与
--i
i--

相似,我不相信前缀(
++i
)和后缀(
i++
)的偏好取决于它是递增还是递减


至于原因,我尽可能喜欢前缀,因为我的母语是英语,在宾语结构之前有一个动词(“吃晚饭”、“开车”),所以“increment
I
”或“decrement
I
”对我来说比“
I
decrement”更自然。当然,如果我使用的是结果,并且我需要表达式中增量之前的值(而不是增量值),我会很乐意使用后缀。

这几乎是一个首选项,只有在对比原语更复杂的类型执行增量之前或之后的操作时,它才会起作用

递增前(
++i
)返回递增后的
i
值,递增后(
i++
)返回递增前的值。因此,如果
i
是一种复杂类型,它重载了增量前和增量后操作符,那么增量前操作符只能返回对象,而增量后操作符必须返回对象的副本,如果对象是实质性的,那么效率可能会较低。在大多数情况下(对于循环增量等),该值无论如何都会被忽略


正如我所说,大多数情况下,这不是一个问题,只是一个首选项。

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

*(stackptr++) = value
当你弹出:

value = *(--stackptr)
(这些已转换为单个ASM指令)

所以人们习惯于在之后递增,在之前递减

您可以看到另一个惯用的例子,即按正反顺序填写:

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

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

< C和C++中,<>代码> +++ >代码> <代码> ->代码>运算符都具有前缀形式:<代码> ++i 和 -I/COD>,后缀形式:<代码> I++<代码>和<代码> I -< /代码>。前者是先评估后使用,后者是先使用后评估。只有当任一形式用作表达式的一部分时,差异才相关。否则,这是一个偏好或风格的问题(或缺乏)

例如,in
int i=0;int n=++i
i
首先递增,然后将其值(现在为1)分配给
n
。在
n=i++
中,
i
的值仍然是1,分配给
n
,然后递增,现在
i==2


当用作语句时,即:
i++++一,当然,但是问题是为什么前缀和后缀。这不是语言不可知的,例如,对于C和C++有不同的答案。但是为什么有人会做<代码> I++<代码>但是<代码> -i <代码>?这就是问题所在。编译器可以很容易地检测是否使用了temp。所以我怀疑代码是否更快。@EmanuelePaolini:是的。这是一个完整的过程。TL;DR-任何模糊的最新编译器都会优化消除差异,即使您确实使用了结果值。在Java中,如果不使用结果,字节码是相同的。如果您这样做,这只是操作码的顺序问题(对于本地int,我没有深入讨论),
iinc/iload_1
vs.
iload_1/iinc
。当然,JIT可能会在某个时候介入。不过,因为我更喜欢前缀…;-)前缀“总是”至少和后缀一样有效,而且可能更有效。正如这里所解释的,你文章中的最后一句话并不完全正确。对于基本类型,如果未使用结果,编译器可以通过将
i++
替换为
++i
来进行优化。如果它不执行此优化,您可能会得到(非常小的)性能差异。但是,对于重载了
运算符+++
的用户定义类型,不允许进行此优化(因为编译器无法保证您已正确实现这两种类型以获得预期的关系)。这意味着,对于C++中用户定义的类型,您选择的形式实际上影响结果。