字符指针的预增量

时间:2015-03-13 10:40:27

标签: c arrays pointers pre-increment

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

#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递增之前块执行。我使用后增量表示法重写了程序,并得到了完全相同的结果,这证实了我的假设。如果是这种情况,那么他们在这个程序中如何区别对待?

6 个答案:

答案 0 :(得分:3)

for循环的增量表达式在正文后执行。对于你的情况

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

类似于

i = s;       // loop init
while (*i)   // loop condition
{
  printf(i);
  ++i;       // loop increment
}

答案 1 :(得分:3)

for (initialization; condition; increase) statement;

for按以下方式运作:

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

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

  3. statement已执行。像往常一样,它可以是单个语句,也可以是用大括号{}包围的块。

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

  5. 循环结束:执行后继续执行下一个语句。

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

答案 2 :(得分:2)

  

我被设置为s的开头,检查布尔条件并保持为真,然后我增加并执行该块。

不完全。实际语法是

  1. i设置为s的开头

  2. 检查布尔条件

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

    2.2。否则就会失控。

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

  4. 注意:在此特定情况下,i的前后增量不会有任何差别。

答案 3 :(得分:1)

相当于

for( a ; b ; c )
{
  statements
}

a ;
while( b ) 
{
  statement
  c ;
}

++i ;
i++ ;

是相同的事情,因为我只被评估并且没有使用评估

答案 4 :(得分:1)

  

原因是,在for循环中,我使用了预增量表示法。我被设置为s的开头,检查布尔条件并保持为真,然后我增加并执行该块。

没有。 块执行后,i递增

  

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

他们不是。后增量或预增量不会造成盲点差异。这两者之间的区别在于表达式i++++i的结果(即,它将评估为前一个值还是新值?)。它不会神奇地改变封装控制结构的整个流程。只要你提供一个导致i递增的表达式,就会抛弃增量表达式的评估结果,因此它并不重要。

这就是这个:

int main()
{
    int x = 5;
    int y = 5;

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

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

int main()
{
   int x = 5;
   x++;
}

int main()
{
   int x = 5;
   ++x;
}

是完全相同的。

答案 5 :(得分:0)

在块执行后我会增加。

试试这个:

for(int i = 0; i < 5; ++i )
{
  printf("\n %d",i);
}