【问题标题】:Increment operator inside array数组内的增量运算符
【发布时间】:2016-03-18 23:39:40
【问题描述】:

我有一个使用数组进行队列操作的 C 程序。在那个程序中,他们在数组中增加一个变量。我无法理解它是如何工作的。所以,请解释一下这些操作:

array[++i];
array[i++];

【问题讨论】:

  • 您能不能更具体地说明您不明白的地方?你知道++ii++ 做什么吗?如果没有,请阅读一本遵循教程的书。
  • array[++i] 预增量 i,然后将访问array[i]array[i++] 将访问 array[i] 然后后增量 i。这些是前增量和后增量的基本情况。您可以编写一个非常简单的测试程序来演示这一点。
  • 我知道 ++i 和 i++ 的区别。但是想使用里面的数组操作。这会将所有数组元素转移到下一个吗?
  • 所以你不知道数组索引是如何工作的?读一本跟着教程的书。
  • ++ii++ 不要对您的数组执行任何隐藏操作(例如“移位”)。他们完全按照我在上一条评论中描述的那样做。但是,它们可以是循环中代码的一部分来执行这种转变。

标签: c++ c arrays post-increment pre-increment


【解决方案1】:

请解释一下这些操作。

  1. array[++i]; - 首先增加i,然后在增加的索引处为您提供元素

    相当于:

    ++i; // or i++
    array[i];
    
  2. array[i++]; - 也首先递增 i,但后缀 operator++ 在递增之前返回 i 的值

    相当于:

    array[i];
    ++i; // or i++
    

他们在数组中增加一个变量。

不,他们没有。您可以说它们在对数组下标运算符的调用中增加 i

【讨论】:

  • 所以,这是正常操作。不会影响数组元素吧?
  • 不,它不会 - 元素,而不是索引。
【解决方案2】:

我知道您的问题是在队列的上下文中,但我将使用堆栈进行说明。

想象一个基于数组的堆栈:

T stack[N];     // for some type T
size_t sp = N;  // stack pointer

在此示例中,堆栈“向下”增长,其中索引 N-1 是堆栈的底部,索引 0 是顶部。

推送操作如下所示:

stack[--sp] = val;

--sp 计算结果为sp - 1,并且作为副作用递减sp 中的值,所以上面的语句相当于写

stack[sp - 1] = val;
sp = sp - 1;

需要注意的是,sp 可能会在分配完成之前更新。

弹出操作如下所示:

val = stack[sp++];

sp++ 计算sp 的当前值,并作为副作用增加sp 中的值,因此相当于写入

val = stack[sp];
sp = sp + 1;

与上述相同的警告。

【讨论】:

    【解决方案3】:

    在评估它之前,++i 递增 i

    i++ inrements i 评估它之后。

    如果i=1array[++i] 设置i=2,然后获取array[2]

    如果i=1array[i++] 获取array[1] 然后设置i=2

    后操作和前操作发生在之后之前他们参与的表达式是评估。

    我通常不鼓励在表达式中使用后置和前置自增运算符。它们充其量会导致混乱,最坏的情况是会导致错误。

    考虑x = array[++i] + array[i--] ; 应该是什么。看看让程序员(或必须修复代码的可怜的魔鬼?:-) 感到困惑是多么容易。

    后置和前置递增和递减操作也可能在宏中产生问题,因为您最终可能会多次重复操作,尤其是使用宏。

    它更简单,更易于维护代码,以避免表达式中的前后增量,IMO。

    【讨论】:

      【解决方案4】:

      所以,您知道i++++ii 加1。此外,该指令返回i,因此您可以将其放在代码中需要i 值的位置。

      两者的区别在于i++是后自增,++i是前自增。这是什么意思?

      好吧,假设i 是 6。当你这样做时:

      array[i++]
      array[i]
      

      你实际上会做:

      array[6]
      array[7]
      

      因为你使用后自增:首先返回值,然后自增i

      如果你这样做:

      array[++i]
      array[i]
      

      你基本上会做:

      array[7]
      array[7]
      

      因为你使用了预递增:先递增i,然后返回它的值。

      现在试着找出你的代码做了什么;-)

      希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        数组[++i]; - 增加 i 的值,然后使用增加的值作为数组的索引

        数组[i++]; -索引到数组中,然后增加 i 的值

        【讨论】:

          猜你喜欢
          • 2013-10-08
          • 2015-08-10
          • 2015-09-25
          • 2013-10-20
          • 2023-03-09
          • 2011-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多