【问题标题】: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 之前都不会执行增量。

标签: c arrays pointers pre-increment


【解决方案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 的工作方式如下:

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

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

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

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

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

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

      【讨论】:

        【解决方案4】:

        相当于

        for( a ; b ; c )
        {
          statements
        }
        

        a ;
        while( b ) 
        {
          statement
          c ;
        }
        

        ++i ;
        i++ ;
        

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

        【讨论】:

          【解决方案5】:

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

          不完全是。实际语法是

          1. i 设置为s 的开头

          2. 检查布尔条件

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

            2.2。否则退出循环。

          3. 然后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;
            }
            

            是相同的。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-05-14
              • 2020-03-11
              • 1970-01-01
              • 2016-12-01
              • 2015-02-12
              • 2019-09-25
              • 2016-07-01
              • 1970-01-01
              相关资源
              最近更新 更多