【问题标题】:confusion regarding *(asterisk) and ++ in c关于 c 中 *(星号)和 ++ 的混淆
【发布时间】:2014-12-31 18:42:21
【问题描述】:
int main()
{
  int a=10;
  int *b=&a;
  int c=*b++;
  printf("%d",c);
}

我知道下面的程序输出 10.但是根据优先级表,它给出了运算符 http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm) 的优先级,post-fix ++ 的优先级高于 = 和 *.so ++ 应该先评估然后 *.then 为什么程序打印输出为 10?

【问题讨论】:

  • 也许你想试试这个:int c = (*b)++;(打印 10)与 int c = ++(*b);(打印 11)。在这两种情况下,a 都变为 11。

标签: c pointers operators


【解决方案1】:

是的,++ 的优先级高于 *。 所以,声明

int c=*b++;

将被评估为

int c=*(b++)

由于是后缀运算符,指针'b'首先递增,但它返回'b'的旧地址(指向存储值10的地址)。 因此,c 的值为 10。

【讨论】:

    【解决方案2】:

    ++ 的优先级高于* 意味着操作数b 将首先绑定到++

     int c = *(b++);
    

    这并不意味着首先评估b++,然后取消引用评估的值。 在*b++ 中,++ 将对b 产生与后自增运算符相同的效果。 *b++ 很简单:取消引用b 的原始值并将指针b 增加1

    【讨论】:

      【解决方案3】:

      它确实有更高的优先级,这意味着指针将增加一,而不是它指向的值。

      但是加一是按顺序到求值结束的(这是后缀++所做的,与优先级没有直接关系),所以你从指针中得到的值是旧的:@ 987654321@ 不是p+1。有了那个指针,你取消引用它并得到 a 的值,即 10。然后指针 p 加一。

      int c = *p ;
      p++ ;
      

      【讨论】:

        【解决方案4】:

        如您所说,++ 的优先级高于*。所以int c=*b++; 解析为int c=*(b++);。但是,后自增运算符的结果是值before 递增。也就是说,赋值等价于

        int temp = b;
        b = b + 1;
        c = *temp;
        

        【讨论】:

        • Assignment 也可以等价于int temp = b; c = *temp; b = b + 1;
        • @hacks 当然可以。我认为我写它的方式在当前上下文中更清晰,因为前两行相当于后增量。您的版本中缺乏接近性模糊了这个问题。
        【解决方案5】:

        ++ 将在更大的表达式的上下文中进行评估后,将内存地址 b 递增。

        来自http://msdn.microsoft.com/en-us/library/e1e3921c.aspx

        重要的是要注意,后缀递增或递减表达式在应用相应运算符之前计算为表达式的值。对操作数求值后进行递增或递减操作。仅当后缀递增或递减操作发生在较大表达式的上下文中时,才会出现此问题。

        所以,发生的情况是您对b 应用了一个后修复增量,但取消引用* 被赋予了b 的原始值,它指向10。如果您要打印出b*b,您会看到值和地址已更改为意想不到的内容。

        【讨论】:

          猜你喜欢
          • 2011-04-11
          • 2012-06-15
          • 1970-01-01
          • 2017-12-06
          • 1970-01-01
          • 2016-08-18
          • 2014-01-10
          • 2012-09-06
          • 2017-09-12
          相关资源
          最近更新 更多