Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于for(),为什么要使用i++;而不是++;我_Java_Php_C++_C - Fatal编程技术网

Java 关于for(),为什么要使用i++;而不是++;我

Java 关于for(),为什么要使用i++;而不是++;我,java,php,c++,c,Java,Php,C++,C,也许在编译器优化后,它对编译器来说并不重要,但在C/C++中,我看到大多数人以以下形式创建for循环: for (i = 0; i < arr.length; i++) for(i=0;i效率更高,但是如果没有存储,则现代编译器不会存储结果。至于何时开始流行对循环进行后加,我的K&R第二版在第65页使用了i++(我在翻阅时发现的循环的第一个)对于整数类型,如果不使用表达式的值,这两种形式应该是等效的。这在C++世界中不再是复杂的,但是在语言名中保存。 我怀疑“I++”在早期变得更加流行,

也许在编译器优化后,它对编译器来说并不重要,但在C/C++中,我看到大多数人以以下形式创建for循环:

for (i = 0; i < arr.length; i++)
for(i=0;i
其中,增量是使用post fix++完成的。我知道这两种形式的区别。i++返回i的当前值,但在安静状态下将i加1++我首先向i添加1,然后返回新值(比原来的值多1)

我认为I++需要更多的工作,因为除了下一个值之外还需要存储上一个值:Push*(&I)到stack(或load到register);增量*(&i)。与++i:Increment*(&i);然后根据需要使用*(&i)

(我知道“Increment*(&I)”操作可能涉及寄存器加载,具体取决于CPU设计。在这种情况下,I++需要另一个寄存器或堆栈推送。)

无论如何,在什么时候,为什么我变得更时尚


我倾向于相信阿什格洛夫:这是一种教育学的东西,因为我们大多数人在Windows或*nix系统上使用C/C++,在那里编译器的质量很高,所以没有人会受到伤害


如果您使用的是低质量的编译器或解释环境,则可能需要对此敏感。当然,如果你正在做高级C++或设备驱动程序或嵌入式工作,希望你有足够的经验,这不是什么大不了的。(狗有Buddah的本性吗?谁知道?)<我的观点是:随着C++的创建,C++变得更加流行,C++使你可以在非平凡对象上调用++。
好的,我详细说明一下:如果你调用
I++
并且
I
是一个非常重要的对象,那么在增量之前存储一个包含I值的副本将比指针或整数更昂贵。

使用哪一个都不重要。在一些非常过时的机器上,在C++的某些情况下,<>代码> +i i/COD>效率更高,但是如果没有存储,则现代编译器不会存储结果。至于何时开始流行对循环进行
后加,我的K&R第二版在第65页使用了
i++
(我在翻阅时发现的循环的第一个

对于整数类型,如果不使用表达式的值,这两种形式应该是等效的。这在C++世界中不再是复杂的,但是在语言名中保存。


我怀疑“I++”在早期变得更加流行,因为这是K&R最初的《C编程语言》一书中使用的风格。你必须问他们为什么选择那个变体。

在某种程度上,这是惯用的C代码。事情通常都是这样做的。如果这是您最大的性能瓶颈,那么您可能正在解决一个独特的问题


然而,看看我的K&R C编程语言第一版,我发现循环中的I(第38页)的第一个实例确实使用了++I,而不是I++。

我认为我的前任对于选择后增量而不是预增量的副作用是正确的


因为它的时尚性,它可能很简单,因为你在语句中以相同的重复方式启动所有三个表达式,这是人类大脑似乎倾向于的。

出于某种原因,
i++
在C中变得更加惯用,尽管它创建了一个不必要的副本。(我认为这是通过K&R实现的,但我在其他答案中看到了争论。)但我不认为C中存在性能差异,因为它只用于内置,编译器可以优化复制操作


< >它确实在C++中有所不同,但是,<>代码> i>代码>可能是用户定义类型,<>代码>运算符++()被重载。编译器可能无法断言复制操作没有可见的副作用,因此可能无法消除它

其他人告诉你的主要规则是:始终如一。选择一个,除非是特殊情况,否则不要使用另一个。

我的理论(为什么i++更流行)是,当人们学习C(或C++)时,他们最终会学会这样编写迭代:

while( *p++ ) {
    ...
}
请注意,修复后的表单在这里很重要(使用中缀表单会产生一次性的bug)

当需要为
++i
i++
编写
循环时,使用后缀形式可能会感觉更自然

添加:我上面写的内容确实适用于基本类型。当使用基本类型编写代码时,您倾向于快速完成任务,并执行自然发生的操作。这是我需要对我的理论提出的重要警告


<> >如果代码> ++< /COD>是C++类上的重载操作符(注释中建议的可能性Realk),那么当然需要对包含此类类的循环进行极度小心,而不是简单地做一些简单的事情。在跳转到开始之前,需要重新加载缓存中的值以增加它。
你不需要的是++i,不需要缓存移动。

追溯到K&R之后,我查看了它的前身:(~1975)。这里的前几个
while
示例使用
++n
。但是每个
for
循环都使用
i++
。所以要回答你的问题:几乎从一开始,
i++
就变得更时尚了。

因为一旦你开始使用“++i”,人们就会感到困惑和好奇。他们将停止那里的日常工作,开始用谷歌搜索解释。12分钟后,他们将进入stack overflow并创建这样一个问题。瞧,你的雇主又花了10美元。至于原因,下面是K&R对这个问题的看法:

布莱恩·柯林汉 你得问问丹尼斯(可能在办公室里)。