C while(*p){p+;+;}与while(*p+;+;}之间有什么区别?
它是关于strcat的C while(*p){p+;+;}与while(*p+;+;}之间有什么区别?,c,C,它是关于strcat的function while (*p) p++; 及 两者都有效,但是 while (*p++) ; 不起作用。我认为第一个和第三个应该是相同的,但它不是。让我们假设p是一个字符串 while (*p) p++; /* (1) */ while (*++p) ; /* (2) */ while (*p++) ; /* (3) */ (1)与(2)不同,如果p是空字符串 (1)与(3)不同,因为使用(3),即使*p的当前值是'\0'字符,p也会递增
function
while (*p)
p++;
及
两者都有效,但是
while (*p++)
;
不起作用。我认为第一个和第三个应该是相同的,但它不是。让我们假设p
是一个字符串
while (*p) p++; /* (1) */
while (*++p) ; /* (2) */
while (*p++) ; /* (3) */
- (1)与(2)不同,如果
p
是空字符串
- (1)与(3)不同,因为使用(3),即使
*p
的当前值是'\0'
字符,p
也会递增
让我们假设
p
是一个字符串
while (*p) p++; /* (1) */
while (*++p) ; /* (2) */
while (*p++) ; /* (3) */
- (1)与(2)不同,如果
p
是空字符串
- (1)与(3)不同,因为使用(3),即使
*p
的当前值是'\0'
字符,p
也会递增
*++p表示增加此变量,然后使用它
*p++表示使用变量,然后增加它*++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++);
*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++
因此,假设(1)“有效”:(2)在p
最初指向非空字符串时也有效。(3) 根本不起作用,因为p
最终指向不同的位置
*++p
递增p
,然后计算p
现在指向的值*p++
计算p
最初指向的值,但也会增加p
。因此(2)和(3)是不同的
(1) 和(3)不同,因为(3)执行p++
,然后决定是否停止。(1) 首先查看*p
以决定是否停止,如果不停止,则执行p++
while (*p) 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. 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++
也会使指针前进 两者
while (*p) 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. 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++
也会使指针前进 2和3只有在增量前后是同一个运算符时才相等,而(*p++)
不会使strcat函数起作用。在这种情况下,“起作用”和“不起作用”是什么意思?我可以使用这三个函数中的任何一个来编写一个strcatstrcat
函数,它们都会“完美地”工作。@AndreyT:我将进行一次巨大的飞跃,并假设这是我们建议的strcat
实现的第一行,下一行是调用strcpy
,目标是p
。更正,不是第一行,因为strcpy
返回原始目的地。因此,在我们开始移动p
之前,需要有另一个等于p
的指针。2和3只有在前后增量是相同的运算符时才会相等,而(*p++)
不会使strcat函数工作。在这种情况下,“工作”和“不工作”应该是什么意思?我可以使用这三个函数中的任何一个来编写一个strcatstrcat
函数,它们都会“完美地”工作。@AndreyT:我将进行一次巨大的飞跃,并假设这是我们建议的strcat
实现的第一行,下一行是调用strcpy
,目标是p
。更正,不是第一行,因为strcpy
返回原始目的地。因此,在我们开始移动p
之前,需要有另一个等于p
的指针。扩展的解释w/预期输出很好。扩展的解释w/预期输出很好。