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
”或“decrementI
”对我来说比“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 和
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++中用户定义的类型,您选择的形式实际上影响结果。