【问题标题】:Why do c++ programmers prefer prefix ++ while java programmers prefer postfix ++? [closed]为什么 c++ 程序员更喜欢前缀 ++ 而 java 程序员更喜欢后缀 ++? [关闭]
【发布时间】:2019-12-20 01:38:41
【问题描述】:

在我看到的代码中,普通样式的 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 循环的方式之间的差异是什么。据我所知,这可能不是出于实际原因,而是出于历史原因,我想知道这些原因是什么。

【问题讨论】:

  • 请注意,您给出的 for 循环示例没有实际区别,至少在 Java 方面是这样。但是,根据上下文的不同,可能存在显着差异。 i++ 将递增并返回旧值,而++i 将递增并返回新值(同样,至少在Java 中是这样)。
  • 在 C++ 的这种特定情况下,两者之间也没有任何相关的区别。后缀增量将需要保存旧值的临时副本,但这没有实际区别,因为它将针对相同的代码进行优化。
  • 我假设 ot 来自未优化的代码,++i 会更有效。但是,即使是最基本的优化,任何编译器都会优化i++
  • @AlexLi 您能否在您的问题中添加一句话来澄清这一点?对我来说,您的问题并不清楚您对历史背景而不是实际相关性感兴趣。
  • “我们为什么不叫它++c”。笑话是:C++ 是 C 的改进,所以增量,但我们返回旧值,因为我们继承了 C 的任何缺陷,也因为大多数程序员(至少在开始时)只是用 C++ 编译器编写 C。老师在std::vector之前显示new[], ....

标签: java c++ for-loop


【解决方案1】:

实际上,如果类型是整数,则差异可以忽略不计,在最常见的平台上不存在。当类型是某种自定义对象(例如迭代器)时,它可以产生影响。考虑:

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,或者它具有非平凡的实现)

【讨论】:

    【解决方案2】:

    后缀形式在早期的 C 编程书籍中被介绍过并且被大量使用。之后,前缀形式开始流行起来,并在 Java 编程书籍中被引入。所以,基本上,这取决于你什么时候开始你的编程生涯。

    与当代优化编译器没有实际区别(至少对于 C/C++)。

    如果你想看起来更高级,使用后缀形式 =)

    【讨论】:

    • 可能值得注意为什么它会在早期的 C 书籍中使用,如果你没有优化它的编译器,前缀会更有效一些离开。具体来说,您可以在变量所在的任何位置递增,而不是先复制它然后递增。
    • 为什么我上面的评论被删除将永远是个谜。
    • @user207421 从未见过你的评论,所以请不要问我 =)
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    相关资源
    最近更新 更多