【问题标题】:what difference between while(*p){p++;} ,while (*++p){;} and while(*p++){;}?while(*p){p++;} ,while (*++p){;} 和 while(*p++){;} 有什么区别?
【发布时间】:2012-08-30 16:53:22
【问题描述】:

关于strcat函数。

while (*p)
    p++;

while (*++p)
    ;

两者都有效,但是

while (*p++)
    ;

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

【问题讨论】:

  • 2 和 3 只有在前后增量是相同的运算符时才相等
  • while (*p++) 不能使strcat 函数工作。
  • 在这种情况下,“有效”和“无效”应该是什么意思?我可以使用这三个函数中的任何一个编写一个strcat 函数,并且它们都可以完美地“工作”。
  • @AndreyT:我将迈出一大步,假设这是我们提议的strcat 实现的第一行,下一行是使用@ 调用strcpy 987654330@作为目的地。
  • 更正,不是第一行,因为strcpy返回原来的目的地。所以在我们开始移动p之前,需要有另一个等于p的指针。

标签: c


【解决方案1】:

假设p 是一个字符串。

while (*p) p++; /* (1) */
while (*++p) ;  /* (2) */
while (*p++) ;  /* (3) */
  • 如果p 为空字符串,则(1)(2) 不同。
  • (1)(3) 不同,因为使用 (3),即使 *p 的当前值是 '\0'字符,p 递增。

【讨论】:

    【解决方案2】:

    两者

    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++ 也会使指针前进。

    【讨论】:

    • 带有预期输出的扩展解释很好。
    【解决方案3】:
    // 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++

    【讨论】:

      【解决方案4】:

      *++p 表示增加这个变量,然后使用它
      *p++ 表示使用变量,然后递增它

      【讨论】:

        猜你喜欢
        • 2019-12-14
        • 1970-01-01
        • 2022-12-04
        • 2019-11-06
        • 1970-01-01
        • 1970-01-01
        • 2018-03-16
        • 2013-12-10
        • 2017-12-16
        相关资源
        最近更新 更多