1

それはstrcat機能についてです。

while (*p)
    p++;

while (*++p)
    ;

両方とも機能しますが

while (*p++)
    ;

動作しません。1番目と3番目は同じである必要があると思いますが、そうではありません。

4

4 に答える 4

7

それが文字列であるとしましょうp

while (*p) p++; /* (1) */
while (*++p) ;  /* (2) */
while (*p++) ;  /* (3) */
  • (1)が空の文字列の場合、 (2)とは異なります。p
  • (1)(3)とは異なります。これは、 (3)では の現在の値が*p文字'\0'であっpてもインクリメントされるためです。
于 2012-08-30T16:56:06.207 に答える
4

両方

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

于 2012-08-30T20:55:14.453 に答える
2
// 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++ます。

于 2012-08-30T17:07:40.307 に答える
-1

*++p は、この変数をインクリメントしてから使用することを
意味します *p++ は、変数を使用してからインクリメントすることを意味します

于 2012-08-30T16:59:10.917 に答える