关于*(星号)和++中的++的混淆
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。