字符指针的预增量[重复]

Posted

技术标签:

【中文标题】字符指针的预增量[重复]【英文标题】:Preincrement in character pointers [duplicate] 【发布时间】:2015-05-15 19:28:11 【问题描述】:

我在玩弄数组指针的概念。我写了这个简单的程序:

#include <stdio.h>

int main (int argc, char **argv)
    char s[] = "Hello world!\n";
    char *i;
    for (i = s; *i; ++i)
        printf(i);
    
    return 0;

这给出了非常有趣的输出:

Hello world!
ello world!
llo world!
lo world!
o world!
 world!
world!
orld!
rld!
ld!
d!
!

然而,当我写这篇文章时,我的印象是输出将从第二行开始。原因是,在 for 循环中,我使用了预增量符号。 i 设置为s 的开头,检查布尔条件并且它成立,然后i 递增并执行块。

这是我的印象,但显然这是错误的,因为块在 i 递增之前执行。我使用后增量符号重写了程序,得到了完全相同的结果,这证实了我的假设。如果是这样,那么他们在这个程序中如何区别对待?

【问题讨论】:

增量 ++i 发生在循环体执行之后。所以在第一个循环中 i == s 是真的。 for 循环中,输入++ii++ 作为第三个参数并不重要。这与使用i++;++i; 相同。只要它们没有在表达式中使用,这两者都是等效的,如下面的答案所示。 @pmg 这不是他感到困惑的原因;无论他使用的是 ++i 还是 i++,在 for 循环中第一次测试 *i 之前都不会执行增量。 【参考方案1】:

for 循环的增量表达式在主体之后执行。对于你的情况

for (i = s; *i; ++i)
  printf(i);

类似于

i = s;       // loop init
while (*i)   // loop condition

  printf(i);
  ++i;       // loop increment

【讨论】:

【参考方案2】:

i 在块被执行后递增。

试试这个:

for(int i = 0; i < 5; ++i )

  printf("\n %d",i);

【讨论】:

【参考方案3】:
for (initialization; condition; increase) statement;

for 的工作方式如下:

    initialization 被执行。通常,这会声明一个计数器变量,并将其设置为某个初始值。这在循环开始时执行一次。

    condition 已检查。如果是true,则循环继续;否则,循环结束,跳过statement,直接进入第5步。

    statement 被执行。像往常一样,它可以是单个语句,也可以是用花括号 括起来的块。

    increase被执行,循环回到步骤2。

    循环结束:继续执行它之后的下一条语句。

postincrement 和 preincrement 没有区别,因为increase 无论如何都是单独执行的。

【讨论】:

【参考方案4】:

相当于

for( a ; b ; c )

  statements

a ;
while( b ) 

  statement
  c ;

++i ;
i++ ;

是相同的东西,因为 i 只被评估,而评估没有被使用

【讨论】:

【参考方案5】:

i 设置为 s 的开头,检查布尔条件并且它为真,然后 i 递增并且块执行。

不完全是。实际语法是

    i 设置为s 的开头

    检查布尔条件

    2.1。如果它成立,则块执行,

    2.2。否则退出循环。

    然后i 递增并继续执行第 2 步。

注意:在这种特殊情况下,i 的前后增量不会有任何区别。

【讨论】:

【参考方案6】:

原因是,在 for 循环中,我使用了预增量符号。 i 设置为 s 的开头,检查布尔条件并成立,然后 i 递增并执行块。

没有。 i 在块执行后递增。

我使用后增量符号重写了程序,得到了完全相同的结果,这证实了我的假设。如果是这样,那么他们在这个程序中如何区别对待?

他们不是。后增量或前增量不会产生盲目的差异。这两者之间的区别在于表达式i++++i 的结果(即,它会计算为先前的值还是新的值?)。它不会神奇地改变封装控制结构的整个流程。增量表达式的计算结果只是被丢弃了,所以只要您提供一个导致增量 i 的表达式,您做什么都没有关系。

是这样的:

int main()

    int x = 5;
    int y = 5;

    int a = x++;
    int b = ++y;

将导致ab 的值不同,因为使用了增量表达式的result,而以下程序:

int main()

   int x = 5;
   x++;


int main()

   int x = 5;
   ++x;

是相同的。

【讨论】:

以上是关于字符指针的预增量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java中的字符不会随后增量更新[重复]

指向字符串常量的指针[重复]

使用指针算术修改字符串文字或字符数组[重复]

C字符串指针与数组[重复]

奇怪的java字符串数组空指针异常[重复]

为啥允许将字符串文字分配给 C++ 中 char * 类型的指针 [重复]