#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
請解釋輸出。爲什麼地址有增量?請解釋此代碼中操作員的相關性
#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
請解釋輸出。爲什麼地址有增量?請解釋此代碼中操作員的相關性
我看到,也可能會被混淆的唯一事情是
++*p++
後置具有比引用操作更高的優先級,因此完全括號看起來
++(*(p++))
其中postincrements p
,取消引用原始值p
得到一個char
,然後預先增加char
的值,然後新值由打印出來10作爲整數。
因此,p
和p
指向的內容都會增加。
您應該查看運算符優先級。
表達式++*p++
被編譯器評估爲((*p) + 1)
,它也有一個副作用:它增加了*p
和p
的值。使用ASCII兼容字符集時,此指令在標準輸出上打印11
('\n'+1 == 10+1 == 11
)。第二個printf
呼叫打印值s[4]
('c'
)。
C中的指針只是表示內存位置的整數。 C中的數組總是處於連續的內存塊中。所以當你有一個指針指向數組的第三個元素,並且你從指針中加1時,它指向第四個元素。
如果您對++*p++
感到困惑:這是因爲前增加(++p)
和增量後(p++)
之間的差異。對於那些討厭C++的人來說,有一個簡單的名字:
「C++ - 改變語言,返回舊問題」。
你從哪裏得到這個可怕的代碼? –
[Operator Precedence ..()和++]的可能重複(http://stackoverflow.com/questions/4897934/operator-precedence-and) – tripleee