while(* p){p ++;},while(* ++ p){;}和while(* p ++){;}之间有什么区别?

这是关于strcatfunction。

 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 ++表示使用变量,然后递增它