为什么它应该输出 4 而输出 5

Why is it outputting 5 when it should output 4

我正在论证它(嗨,我是迈克尔)。但它输出
字符串 '1' - 'Hi'
字符串 '2' - 'this'
字符串 '3' - 'is'
字符串 '4' - 'Michael'
字符串总数:5
当它应该说字符串总数为 4

#include <stdio.h>
#include <stdlib.h>
/* print a given string and a number in a pre-determined format. */
void
print_string(int num, char* string)
{
    printf("String '%d' - '%s'\n", num, string);
}

int
main(int argc, char* argv[])
{
    int i;

    /* check for command line arguments */
    if (argc < 2) { /* 2 - 1 for program name (argv[0]) and one for a param. */
        printf("Usage: %s [<string> ...]\n", argv[0]);
        return(1);
    }

    /* loop over all strings, print them one by one */
    for (argc--, argv++, i = 1; argc > 0; argc--, argv++, i++) {
        print_string(i, argv[0]);  /* function call */
    }

    printf("Total number of strings: %d\n", i);

    getchar();
    return 0;
}

您看到 5 而不是 4 的原因是因为您从 1 开始 i,而不是 0,并且它在 for 循环中递增:

for (argc--, argv++, i = 1; argc > 0; argc--, argv++, i++) {
    //                                                ^^^
}

在最后一次迭代中打印 String 4 之后,循环计数器最后一次递增,为下一次打印输出产生 5

这是因为 "for" 循环的工作原理。每次迭代循环时,它都会先递增 i (i++),然后再检查循环的退出条件 (argc > 0)。

所以当您从 i = 1 开始时,会发生以下情况:

  • 它打印 "Hi",将 i 递增到 2,然后检查 argc > 0,检查 通过
  • 它打印 "this",将 i 递增到 3,然后检查 argc > 0, 检查通行证
  • 它打印 "is",将 i 递增到 4,然后检查 argc > 0,检查通过
  • 它打印 "Michael",将 i 递增到 5,然后检查 如果 argc > 0,检查失败,所以我们退出循环

所以当我们到达最终打印时,i 等于 5。