【问题标题】:When should we use ++x and x++? [duplicate]我们什么时候应该使用 ++x 和 x++? [复制]
【发布时间】:2019-11-15 19:07:20
【问题描述】:

++x和x++有什么区别?

我知道 ++x 递增然后返回值。 和 x++ 分配值然后添加。

但我仍然不确定它是如何工作的以及何时使用其中任何一个。 请帮忙。提前致谢

【问题讨论】:

  • 这似乎很明显,如果你想使用增量之前的值使用x++,如果你想使用增量之后的值使用++x,如果你不在乎(所有你关心的是增加变量)然后使用。我个人更喜欢 ++x 在不关心的情况下,但我似乎是少数。
  • 由于我是老式的,如果我有选择的余地,我总是使用++x 而不是x++,因为前者不会比后者慢,尤其是在运算符重载的情况下.但这已经过时了——如果它曾经流行过的话。在这样的讨论中经常会说“编译器会优化它”这句话。
  • 当 x 是一个类时会有性能影响,例如std::map::iterator。见my answer to a related question
  • @Bathsheba,我遵循与您相同的编码准则来增加变量。它对我来说并没有过时。
  • 如果我需要在当前表达式中计算增量,那么我在所有其他情况下使用++x x++

标签: c++ increment


【解决方案1】:

这段代码是一个无关紧要的例子

int array[3];
for (int i = 0; i < 3; ++i)
    array[i] = 0;

这段代码完全一样

int array[3];
for (int i = 0; i < 3; i++)
    array[i] = 0;

这里有一些类似的代码,它确实有所作为

int array[3];
int i = 0;
while (i < 3)
    array[i++] = 0;

在这段代码中,我们在增量之前使用了i 的值,所以我们确实有效地执行了array[0] = 0; array[1] = 0; array[2] = 0;。没关系,但是这个版本不正确

int array[3];
int i = 0;
while (i < 3)
    array[++i] = 0;

这里我们在增量之后使用i 的值,所以我们确实有效地执行了array[1] = 0; array[2] = 0; array[3] = 0;,这是一个错误,因为array[0] 没有被分配,更糟糕的是array[3] 不是一个有效的数组元素。

【讨论】:

    【解决方案2】:

    x++ 是后增量 & ++x 是前增量。说

    ++x:

    int x=3;
    int y=++x; //Here result of y is 4 and x is 4
    

    x++:

    int x=4;
    int y=x++; //Here result of y is 4 and x is 5 After this line execution
    

    何时使用前/后,这完全取决于您的编程逻辑。示例代码

    int add(int x, int y)
    {
         return x + y;
    }
    
    
    int main()
    {
        int x = 5;
        int value = add(x, ++x); // is this 5 + 6, or 6 + 6?  It depends on what order your compiler evaluates the function arguments in
    
        std::cout << value; // value could be 11 or 12, depending on how the above line evaluates!
        return 0;
    }
    

    如果是 GCC,您将得到 12 的输出。

    【讨论】:

      【解决方案3】:

      它本身并没有太大的差异。但是这种增量操作对您使用它们的方式和位置很重要。例如,您尝试在索引“x”中分配一些值,然后该索引将递增。

      比如说,在你的代码执行的某个时刻,x = 3;

      如果你写, 数组[x++] = 值;

      然后“值”将被分配给数组[3]。因为正如你所说,x++ 将赋值然后添加。

      如果你写的话, 数组[++x] = 值;

      然后'value'将被分配给数组[4]。因为正如您所说, ++x 递增然后返回值。

      所以最终由编码人员在合适的地方使用此功能。 为了更清楚地观察它,我在下面发布了一个示例代码。

      int dp[10];
      
      int main(){
      
          int x = 3;
      
          dp[x++] = 4;
      
          for(int i=1;i<10;i++){
              cout<<i << " " << dp[i]<<endl;
          }
      
          cout<<"--------------------------"<<endl;
          memset(dp, 0,sizeof dp);
          x = 3;
          dp[++x] = 4;
          for(int i=1;i<10;i++){
              cout<<i << " " << dp[i]<<endl;
          }
      
          return 0;
      }
      

      【讨论】:

      • 如果您已经知道 ++x 和 x++ 之间的区别,但您的示例将走得更远(我认为),那么您的解释是可以理解的。
      • 谢谢。是的我同意。但我认为问题是何时使用 x++ 或 ++x。在这里提出问题的人已经知道他在帖子中所说的区别。这就是为什么我选择展示一个工作示例。
      【解决方案4】:

      ++x 是递增和取数

      x++ 是获取和递增

      如果用户定义的类正在实现后递增,则返回类型为 const 。

      但在预增量的情况下,返回类型将是参考。

      所以后增量会导致临时的创建和销毁。 虽然预增量不会受到此类额外成本的影响。

      ++x 应尽可能用于用户定义的类。

      【讨论】:

        猜你喜欢
        • 2014-08-31
        • 2014-10-26
        • 2021-09-07
        • 2021-01-19
        • 1970-01-01
        • 2012-11-24
        • 2015-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多