这是关于strcat
功能的。
while (*p)
p++;
和
while (*++p)
;
两者都有效,但是
while (*p++)
;
不起作用。我认为第一个和第三个应该相同,但事实并非如此。
这是关于strcat
功能的。
while (*p)
p++;
和
while (*++p)
;
两者都有效,但是
while (*p++)
;
不起作用。我认为第一个和第三个应该相同,但事实并非如此。
假设这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 终止符的一个字符。
要了解原因,让我们假设内存中有以下字符:
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++
即使 的值为*p
0,求值也会使指针前进。
// 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++
。
*++p 表示递增该变量,然后使用它
*p++ 表示使用该变量,然后递增它