2014-11-04 46 views
2
int main() 
{ 
    int a=10; 
    int *b=&a; 
    int c=*b++; 
    printf("%d",c); 
} 

我根据优先级表,该表给出了操作者的http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm优先),修复后知道以下方案产出10.but ++的优先级高于=和*。所以++应该首先评估,然后*。然后为什么程序打印输出为10?关于*(星号)的混乱和++在C

+0

也许你打算试试这个:int c =(* b)++;'(打印10)与'int c = ++(* b);'(打印11)。在这两种情况下,'a'都变为11. – JS1 2014-11-04 20:44:36

回答

3

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

但是,增加一个排序到评估结束(这是postfix ++所做的,并且与优先级没有直接关系),所以您从指针中获得的值是旧值: p不是p+1。有了这个指针,你可以对它进行解引用并得到a的值,即10。然后指针p增加1。

int c = *p ; 
p++ ; 
0

++的优先级高于*意味着操作数b将结合++首先作为

int c = *(b++); 

它不会在该评价b++第一和然后解除引用的评价值的任何方式的意思。 在*b++,++b的影响与后增量运算符相同。 *b++很简单:取消原始值b并将指针b增加1

0

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

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

赋值也可能等价于'int temp = b; c = * temp; b = b + 1;'。 – haccks 2014-11-04 18:52:59

+0

@haccks当然可以。我认为,由于前两行相当于后期增量,所以我在当前的情况下写得更清楚。您版本中缺乏接近度会模糊此问题。 – 2014-11-04 18:58:48

0

++将在更大的表达式的上下文做的b增量,存储器地址,评估后。

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

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

那么,什么情况是,你应用修订后的增量b,但是提领*给出的b原始值,它指向10。如果您要打印出b*b,则会看到价值和地址已更改为意想不到的情况。

0

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

int c=*b++; 

将被评估为

int c=*(b++) 

因为它是修复后的运营商,指针“B”先增加,但它返回“B”的旧地址(指向存储值10)。因此,c的值为10.