これは文字列のコピーですが、元のポインタ値は失われています。元のポインタ値を保存する必要があります。
int main()
{
char *p1 = "Hello";
char *p2 = malloc(20);
char *p3 = p2;
memset (p2, 0, 20);
while (*p2++ = *p1++);
printf ("%s\n", p3);
}
whileループの実際の意味論的な説明は次のようなものになるだろう:
for (;;) {
char *q2 = p2; // original p2 in q2
char *q1 = p1; // original p1 in q1
char c = *q1; // original *p1 in c
p2 += 1; // complete post increment of p2
p1 += 1; // complete post increment of p1
*q2 = c; // copy character *q1 into *q2
if (c) continue; // continue if c is not 0
break; // otherwise loop ends
}
q1
とq2
が保存され、p2
とp1
がインクリメントされる順序を入れ替えてもよいという順序。 〜c
の保存は、q1
が保存された後にいつでも実行できます。 c
から*q2
への割り当ては、c
が保存された後にいつでも実行できます。私の封筒の裏には、少なくとも40種類の解釈があります。
出典
2013-05-16 07:11:34
jxh
[どのように "while(* s ++ = * t ++)"は動作しますか?](http://stackoverflow.com/q/810129/4279) – jfs