我學爲我的編程語言考試,我在無意中發現這個(用C語言編寫):理解C:遞增指針
*tp++ = *sp++
;
我明白了什麼*tp = *sp
;可能會做,但在這裏,指針何時增加?之前,值提取後?按什麼順序?我很感謝你的回答
我學爲我的編程語言考試,我在無意中發現這個(用C語言編寫):理解C:遞增指針
*tp++ = *sp++
;
我明白了什麼*tp = *sp
;可能會做,但在這裏,指針何時增加?之前,值提取後?按什麼順序?我很感謝你的回答
由於++
操作符位於變量之後,因此值將在計算表達式後遞增。因此,這會將當前由sp
指向的值分配給當前由tp
指向的位置,然後增加兩個指針。
如果表達式代替
*(++tp) = *(++sp)
然後,指針將評估之前遞增。
這些結構通常發生在循環內部。
+1。很好的解釋。 – 2011-05-28 12:19:14
它們在指針地址相等後遞增。如果你不想這樣做,你應該使用++*tp
和++*sp
。
,該值不會做您認爲的操作! – 2011-05-28 12:16:16
是的,++ * tp遞增了tp指向的值,而不是tp本身。此外,原始表達式與指針的地址*是否相等無關。 – 2011-05-28 12:17:24
++
是後增加操作符,因爲它們立即出現在指針之後(而不是緊接在之前);兩個指針在賦值之後(取消引用的地址)遞增。
它等同於:
*tp = *sp;
tp++;
sp++;
*tp++ = *sp++;
相當於
*tp = *sp;
tp++;
sp++;
所以它複製的價值指向sp
的位置指向tp
再增加兩個指針。
+1。從我....... – 2011-05-28 12:25:49
在
*tp++ = *sp++;
有四件事情hapenning:
tp
sp
只要結果是正確的,任何順序是有效的(它只是取決於一種或多種QoI)
*tp = *sp; tp++; sp++;
savedtp_register = tp; tp++; *savedtp_register = *sp; sp++;
savedsp_register = *sp; sp++; *tp = savedsp_register; tp++;
你應該小心相信'後'這個詞。確實,在這個的例子中,的行爲就好像指針在賦值之後遞增,但C編譯器沒有義務按照該順序實際執行任何操作,只要結果相同即可。
具體地,存在以下步驟:
訂單上的唯一的限制是明顯的,即正在使用前值必須是可用的。你不知道,也不應該猜測,編譯器會選擇什麼樣的順序。另一方面,分號(語句終結符)是一個「序列點」,它告訴編譯器不允許對它重新排序效果 - 除非它能證明它不會改變結果(但可能會更快,例如)。
如果您嘗試在同一個語句中多次使用相同的指針變量,那麼這些都是最相關的,但即使在您的示例中,如果您的指針碰巧指向自己,它也可能會有所不同。
這是一個後增量操作符,因此它會提取該值,然後遞增指針地址 – 2011-05-28 12:15:30