古怪的C 語法 p q

2021-06-20 11:57:30 字數 835 閱讀 5745

牛人們在標準庫中的寫法,以不可讀性換取效率:

while(*p

++=*

q++);

1 分析

因為++在變數後面,變數q不會增加,一直到表示式被求值。

後置自增操作符++(優先順序為1),優先順序要高於解析引用操作符(優先順序為2),高於賦值操作符。

後置自增操作符++(優先順序為1),優先順序要高於解析引用操作符(優先順序為2)。

運算過程如下:

求右式的值:先將q值取出(此時為old_q),然後q自增1,最後取出位址old_q指向的值,右側的值為2.

求左式的值:先將p值取出(此時為old_p),然後p自增1,最後取出位址old_p指向的值,將*old_q的值賦值給*old_p.

如果old_q指向的值為'\0',則迴圈結束。

2 **驗證

#include "stdio.h"

void main()

輸出結果

原來的q=12ff60 *q=2

原來的p=12ff3c *p=1

位址變化的結果p-pold=1 變化的q=12ff64 *q=-858993460

變化的p=12ff40 *p=-858993460 *(p-1)=2

3 應用

char * strcpy(char p, const char * q)

等效**

while (true)

4 參考文獻

C語言 p q 理解

經查表,首先 與 的優先順序是一樣的,根據編譯原理應當遵守靠右的規則,所以 p p 網上已經有很多帖子貼 測試過了,這裡我直接引用結論,那就是i 是先使用 i 後自增,而 i 是先自增後使用 i 引用上面2個結論,那麼下面的 會輸出什麼結果呢?int a int p a printf d p 輸出結...

C 中的古怪錯誤提示

在一原始檔中定義了如下兩個函式 使用倒插法,向鍊錶中新增結點 插入元素,倒插法,新插入的元素為表的第乙個元素 2 void ds insertfirst ds link head phead,int elem 生成乙個新的結點 生成乙個新的結點 2 struct ds link node ds cr...

linux下C程式設計(四)之 p q

真的被這個指標弄得差點崩潰了,還算好,今天終於理解下面的這個程式了,變數放在雙等號的右邊,常量放在左邊,結果出現了這個樣子的東西,然後我就傻眼了。p q 這一篇下面的程式會出現錯誤,因為這樣指標p的位址早都變化 p 這個指標成為野指標了,對於指標q也是如此。include int main int ...