それはstrcat機能についてです。
while (*p)
    p++;
と
while (*++p)
    ;
両方とも機能しますが
while (*p++)
    ;
動作しません。1番目と3番目は同じである必要があると思いますが、そうではありません。
それはstrcat機能についてです。
while (*p)
    p++;
と
while (*++p)
    ;
両方とも機能しますが
while (*p++)
    ;
動作しません。1番目と3番目は同じである必要があると思いますが、そうではありません。
それが文字列であるとしましょうp。
while (*p) p++; /* (1) */
while (*++p) ;  /* (2) */
while (*p++) ;  /* (3) */
p*p文字'\0'であっpてもインクリメントされるためです。両方
while (*p) p++;
と
while (*++p) ;
p文字列の 0 ターミネータを指すように進みますが、
while (*p++) ;
pターミネータ 0 の 1 文字後のポイント  に進みます。
理由を確認するために、メモリ内に次の文字があると仮定します。
Address         0x00 0x01 0x02 0x03
-------         ---- ---- ---- ----
0x8000           'a'  'b'  'c'   0
0x8004           ...
pアドレス 0x8000 から始まるとします。最初のループがどのように再生されるかを次に示します。
1.  *p = 'a'
2.  p = 0x8001
3.  *p = 'b'
4.  p = 0x8002
5.  *p = 'c'
6.  p = 0x8003
7.  *p = 0
8.  end loop
2 番目のループの実行方法は次のとおりです。
1.  p = 0x8001
2.  *p = 'b'
3.  p = 0x8002
4.  *p = 'c'
5.  p = 0x8003
6.  *p = 0
7.  end loop
そして、これが最後のものです:
1.  *p = 'a'
2.  p = 0x8001
3.  *p = 'b'
4.  p = 0x8002
5.  *p = 'c'
6.  p = 0x8003
7.  *p = 0;
8.  p = 0x8004
9.  end loop
前回のバージョンでは、 の値が 0  *p++の場合でも、評価するとポインターが進みます。*p
// move p forward as long as it points to a non-0 character,
// leave it pointing to a 0 character.
while (*p) p++;  
// move p forward until it points to a 0 character, skipping the first 
// character before you start
while (*++p);
// move p forward until it points one past a 0 character
while (*p++);
したがって、(1)「機能する」:(2)p最初に空でない文字列を指している場合も機能します。p(3)別の場所を指してしまうため、まったく機能しません。
*++pインクリメントしてから、現在指しているpものに評価されます。は、最初に指しているものに評価されますが、インクリメントされます。したがって、(2) と (3) は異なります。p*p++pp
(1) と (3) は違います。(3) は を実行してp++から、停止するかどうかを決定するからです。(1) 最初に を見*pて停止するかどうかを決定し、停止しない場合は を実行しp++ます。
*++p は、この変数をインクリメントしてから使用することを
意味します *p++ は、変数を使用してからインクリメントすることを意味します