【问题标题】:Beginner C arrays and incrementation初学者 C 数组和增量
【发布时间】:2017-08-14 21:10:50
【问题描述】:

请原谅业余爱好者,但我真的很难理解基本的递增机制。 cmets 是否正确?

#include <stdio.h>

main()
{
int a[5]={1,2,3,4,5};
int i,j,m;
i = ++a[1]; // the value of a[1] is 3. i=3
j = ++a[1]; /* because of the previous line a[1]=3 
and now a[1]=4? but not in the line defining i? */
m = a[i++];  /* i retained the value of 3 even though the value of a[1] has changed
so finally i++ which is incremented in printf()? */
printf("%d, %d, %d", i,j,m);    
}

我本可以回答自己的问题,但到目前为止,我在学习 C 时已经自欺欺人了好几次了。

【问题讨论】:

  • 这里的问题不是很清楚 - 你观察到什么行为?
  • 我认为问题是“cmets 是否正确”
  • 是的,++ 正在改变它的操作数。
  • pre 和 post inc/dec 运算符对它们赋予的任何左值执行。在第一种情况下,该左值是a[1]。在第二种情况下,也是a[1]。在第三种情况下,只需 i。就是这样。
  • 第一个++a[1]a[1]2 更改为3,第二个++a[1]a[1]3 更改为4

标签: c arrays increment


【解决方案1】:

i = ++a[1] 会将a[1] 的值增加到3,并且++a[1] 的结果3 将分配给i

j = ++a[1]; 会将a[1] 的值增加到4++a[1] 的结果4 将分配给j

m = a[i++];,会将a[3] 的值(因为i 现在是3 b)分配给m,即4i 将增加1。现在i 变为4

【讨论】:

    【解决方案2】:

    使用++-- 运算符要记住的是,表达式具有结果副作用++i结果i 加上1 的原始值。 ++i副作用是将1 添加到存储在i 中的值。

    所以,如果i 最初是0,那么在表达式中

    j = ++i
    

    j 得到0 + 1 的结果(i 的原始值加上1)。作为副作用,1 被添加到当前存储在i 中的值。所以在计算这个表达式之后,ij 都包含 1

    ++ 的后缀版本略有不同; i++resulti 的原始值,但副作用是一样的 - 将 1 添加到存储在 i 中的值。所以,如果i原来是0,那么

    j = i++;
    

    j 获取i (0) 的原始值,并将1 与存储在i 中的值相加。在这个表达式之后,j0i1

    重要 - 未指定执行对j 的分配和对i 的副作用的确切顺序。 i 必须在分配j 之前更新,反之亦然。因此,++-- 的某些组合(包括但不限于i = i++i++ * i++a[i++] = ia[i] = i++)将导致未定义的行为;结果会因平台、优化和周围代码的不同而变化,不可预知

    所以,让我们想象一下你的对象在内存中的布局是这样的:

       +---+
    a: | 1 | a[0]
       +---+
       | 2 | a[1]
       +---+
       | 3 | a[2]
       +---+
       | 4 | a[3]
       +---+
       | 5 | a[4]
       +---+
    i: | ? |
       +---+
    j: | ? |
       +---+
    m: | ? |
       +---+
    

    首先我们评估

    i = ++a[1];
    

    ++a[1]结果a[1] 的原始值加上 1 - 在本例中为 3副作用是更新a[1] 中的值。在此语句之后,您的对象现在看起来像这样:

       +---+
    a: | 1 | a[0]
       +---+
       | 3 | a[1]
       +---+
       | 3 | a[2]
       +---+
       | 4 | a[3]
       +---+
       | 5 | a[4]
       +---+
    i: | 3 |
       +---+
    j: | ? |
       +---+
    m: | ? |
       +---+
    

    现在我们执行

    j = ++a[1];
    

    同样的处理——j 得到a[1] 的值加1,副作用是更新a[1]。经过评估,我们有

       +---+
    a: | 1 | a[0]
       +---+
       | 4 | a[1]
       +---+
       | 3 | a[2]
       +---+
       | 4 | a[3]
       +---+
       | 5 | a[4]
       +---+
    i: | 3 |
       +---+
    j: | 4 |
       +---+
    m: | ? |
       +---+
    

    终于有了

    m = a[i++];
    

    i++ 的结果是3,所以m 得到了存储在a[3] 中的值。副作用是将1 添加到存储在i 中的值。现在,我们的对象看起来像

       +---+
    a: | 1 | a[0]
       +---+
       | 4 | a[1]
       +---+
       | 3 | a[2]
       +---+
       | 4 | a[3]
       +---+
       | 5 | a[4]
       +---+
    i: | 4 |
       +---+
    j: | 4 |
       +---+
    m: | 4 |
       +---+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-16
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 2013-04-27
      • 2017-03-26
      • 1970-01-01
      相关资源
      最近更新 更多