while(* p){p ++;},while(* ++ p){;}和while(* p ++){;}之间有什么区别?
这是关于strcat
function。
while (*p) p++;
和
while (*++p) ;
两者都有效,但是
while (*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
值为0,评估*p++
会使指针前进。
我们假设p
是一个字符串。
while (*p) p++; /* (1) */ while (*++p) ; /* (2) */ while (*p++) ; /* (3) */
- 如果
p
是空字符串,则(1)与(2)不同。 - (1)与(3)不同,因为对于(3) ,即使
*p
的当前值是'\0'
字符,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
最初指向非空字符串也有效。 (3)根本不起作用,因为p
最终指向不同的地方。
*++p
递增p
然后计算到现在指向的p
。 *p++
计算最初指向的p
,但也增加p
。 因此(2)和(3)是不同的。
(1)和(3)是不同的,因为(3)执行p++
,然后它决定是否停止。 (1)首先查看*p
以决定是否停止,如果不停止则执行p++
。
* ++ p表示递增此变量,然后使用它
* p ++表示使用变量,然后递增它