关于*(星号)和++中的++的混淆

时间:2014-11-04 18:37:54

标签: c pointers operators

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 ++应先评估然后*。那么为什么程序打印输出为10?

5 个答案:

答案 0 :(得分:3)

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

但是增加一个是按照评估的结尾排序(这就是postfix ++的作用,而且与优先级没有直接关系),所以你从指针中得到的值是旧值:{ {1}}不是p。有了这个指针,你取消引用它并获得a的值,即10.然后指针p+1加1。

p

答案 1 :(得分:0)

++的优先级高于*,表示操作数b首先绑定到++

 int c = *(b++);

这并不意味着首先评估b++然后取消引用评估值。 在*b++中,++b的影响与后增量运算符相同。 *b++只是:取消引用b的原始值,并将指针b增加1

答案 2 :(得分:0)

正如您所说,++的优先级高于*。因此int c=*b++;解析为int c=*(b++);。但是,后增量运算符的结果是之前递增的值。换句话说,赋值相当于

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

答案 3 :(得分:0)

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

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

  

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

那么,会发生什么情况是您将修复后的增量应用于b,但取消引用*的原始值为b,其指向10 }。如果您要打印b*b,您会看到值和地址已更改为意外的内容。

答案 4 :(得分:0)

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

int c=*b++;

将被评估为

int c=*(b++)

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