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

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?

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

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

 int c = *p ; p++ ; 

在较大表达式的上下文中进行评估之后, ++将执行b (内存地址)的增量。

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

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

因此,会发生什么情况是您将后固定增量应用于b ,但是取消引用*被赋予b的原始值,其指向10 。 如果您要打印出b*b您会看到值和地址已更改为意外。

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

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

++具有比*更高的优先级,意味着操作数b将首先绑定到++

  int c = *(b++); 

它并不意味着首先评估b++然后取消引用评估值。 在*b++++b与后增量运算符的影响相同。 *b++很简单:取消引用b原始值并将指针b递增1

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

 int c=*b++; 

将被评估为

 int c=*(b++) 

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