Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C while(*p){p+;+;}与while(*p+;+;}之间有什么区别?_C - Fatal编程技术网

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

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也会递增

它是关于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
    也会递增

    • 让我们假设
      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函数起作用。在这种情况下,“起作用”和“不起作用”是什么意思?我可以使用这三个函数中的任何一个来编写一个strcat
strcat
函数,它们都会“完美地”工作。@AndreyT:我将进行一次巨大的飞跃,并假设这是我们建议的
strcat
实现的第一行,下一行是调用
strcpy
,目标是
p
。更正,不是第一行,因为
strcpy
返回原始目的地。因此,在我们开始移动
p
之前,需要有另一个等于
p
的指针。2和3只有在前后增量是相同的运算符
时才会相等,而(*p++)
不会使strcat函数工作。在这种情况下,“工作”和“不工作”应该是什么意思?我可以使用这三个函数中的任何一个来编写一个strcat
strcat
函数,它们都会“完美地”工作。@AndreyT:我将进行一次巨大的飞跃,并假设这是我们建议的
strcat
实现的第一行,下一行是调用
strcpy
,目标是
p
。更正,不是第一行,因为
strcpy
返回原始目的地。因此,在我们开始移动
p
之前,需要有另一个等于
p
的指针。扩展的解释w/预期输出很好。扩展的解释w/预期输出很好。