それは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++
p
p
(1) と (3) は違います。(3) は を実行してp++
から、停止するかどうかを決定するからです。(1) 最初に を見*p
て停止するかどうかを決定し、停止しない場合は を実行しp++
ます。
*++p は、この変数をインクリメントしてから使用することを
意味します *p++ は、変数を使用してからインクリメントすることを意味します