java - 为什么 c++ 程序员更喜欢前缀 ++ 而 java 程序员更喜欢后缀 ++?
问题描述
在我看到的代码中,普通样式的 java for 循环如下所示:
for(int i = 0; i < n; i++){\\do stuff}
在 c++ 中,等价的示例将编写如下:
for(int i = 0; i < n; ++i){\\do stuff}
我看不出语法差异的原因。我读过 ++i 可能会稍微快一些,这证明了它在 c++ 中的使用是合理的,但是为什么我们在 java 中使用 i++ 呢?另外,我们为什么不叫它++c?
澄清:我感兴趣的是为什么两种语言之间的语法差异发展不同,而不是两种编写 for 循环的方式之间的差异是什么。据我所知,这可能不是出于实际原因,而是出于历史原因,我想知道这些原因是什么。
解决方案
实际上,如果类型是整数,则差异可以忽略不计,在最常见的平台上不存在。当类型是某种类型的自定义对象(例如迭代器)时,它可以产生影响。考虑:
class iter
{
int* ptr; //< lazy
public:
iter& operator ++ () //< prefix
{
++ptr;
return *this;
}
iter operator ++ (int) //< postfix
{
iter it(*this); //< temp copy
++ptr;
return it;
}
};
在这种情况下,后缀运算符需要复制,而前缀则不需要。在最常见的情况下,编译器会看穿您正在做什么(修复前或修复后),并将代码优化为完全相同。如今唯一真正的问题是编译器是否无法看穿您的迭代器(例如,您没有内联迭代器类,而是将其导出为 DLL,或者它具有非平凡的实现)
推荐阅读
- amazon-web-services - 具有动态策略的 AWS STS Tem 凭证
- sql - 使用多个 CASE 子句对最后一个语法排序空值
- botframework - 如何捕获从 FormFlow 对话框中抛出的异常?
- java - 回退函数中的 Hystrix executionException 和 failedExecutionException
- java - 了解 G1 垃圾收集器在特定 GC 阶段长时间停顿的原因
- junit - 在所有其他测试之前运行一次特定的 JUnit 测试
- actions-on-google - 如何在谷歌助手中访问用户位置
- c++ - 当我们在 C++ 中创建类的对象时,为成员函数分配的内存在哪里?
- vue.js - VueJS 验证在运行时更改语言环境
- twitter-bootstrap - 我的网站社交媒体图标不反映移动设备,