2012-09-27 79 views
1
#include <stdio.h> 
int main(void) 
{ 
    char s[] = {'a','b','c','\n','c','\0'}; 
    char *p; 
    p=&s[3]; 
    printf("%d\t",++*p++); 
    printf("%d",*p); 
    return 0; 
} 

輸出:11 99
請解釋輸出。爲什麼地址有增量?請解釋此代碼中操作員的相關性

+1

你從哪裏得到這個可怕的代碼? –

+0

[Operator Precedence ..()和++]的可能重複(http://stackoverflow.com/questions/4897934/operator-precedence-and) – tripleee

回答

2

我看到,也可能會被混淆的唯一事情是

++*p++ 

後置具有比引用操作更高的優先級,因此完全括號看起來

++(*(p++)) 

其中postincrements p,取消引用原始值p得到一個char,然後預先增加char的值,然後新值由打印出來10作爲整數。

因此,pp指向的內容都會增加。

0

您應該查看運算符優先級。
表達式++*p++被編譯器評估爲((*p) + 1),它也有一個副作用:它增加了*pp的值。使用ASCII兼容字符集時,此指令在標準輸出上打印11'\n'+1 == 10+1 == 11)。第二個printf呼叫打印值s[4]'c')。

0

C中的指針只是表示內存位置的整數。 C中的數組總是處於連續的內存塊中。所以當你有一個指針指向數組的第三個元素,並且你從指針中加1時,它指向第四個元素。

如果您對++*p++感到困惑:這是因爲前增加(++p)和增量後(p++)之間的差異。對於那些討厭C++的人來說,有一個簡單的名字:

「C++ - 改變語言,返回舊問題」。