1

这是关于strcat功能的。

while (*p)
    p++;

while (*++p)
    ;

两者都有效,但是

while (*p++)
    ;

不起作用。我认为第一个和第三个应该相同,但事实并非如此。

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 终止符的一个字符。

要了解原因,让我们假设内存中有以下字符:

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

这是第二个循环的播放方式:

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

在上一个版本中,*p++即使 的值为*p0,求值也会使指针前进。

于 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最初指向非空字符串也有效。(3) 根本不起作用,因为p最终指向不同的地方。

*++p递增p,然后评估p现在指向的任何内容。*p++评估p最初指向的任何内容,但也会增加p. 因此(2)和(3)是不同的。

(1) 和 (3) 不同,因为 (3) 执行p++,然后它决定是否停止。(1) 先看*p决定是否停止,不停止则执行p++

于 2012-08-30T17:07:40.307 回答
-1

*++p 表示递增该变量,然后使用它
*p++ 表示使用该变量,然后递增它

于 2012-08-30T16:59:10.917 回答