任何人都可以解释这个程序中发生了什么

时间:2015-02-14 13:41:49

标签: c

#include <stdio.h>

int main ()
{
    int i;
    int m = 1;

    for (i = 0 ; i < m ; i++) {
        printf("a");
        i++;
        m++;
    }
    return 0;
}

此程序将输出设为a

#include <stdio.h>

int main ()
{
    int i;
    int m = 1;

    for (i = 0 ; i < m ; i++) {
        printf("a");
        i++;
        m = 5;
    }
    return 0;
}

虽然这会将输出设为aaa

任何人都可以解释究竟发生了什么。

2 个答案:

答案 0 :(得分:4)

在您的第一个程序中,您执行i++两次,m++一次。因此,在第一次迭代结束时,i和m的值相等(即2) - 因此在下一次迭代中i < m条件失败,并且循环退出。

在第二种情况下,将m(停止条件)的值设置为5,循环执行直到满足(m<5)停止条件。

请注意,更改循环内停止条件的值通常是一种不好的做法,因为这会导致混淆,例如这样。

答案 1 :(得分:2)

要查找这些错误,逐行手动运行程序并观察变量的值是有帮助的。

第一个项目:

int i;             // i = ?
int m = 1;         // i = ?, m = 1
i = 0;             // i = 0, m = 1
i < m              // true
// first iteration
printf ("a");
i++;               // i = 1, m = 1
m++;               // i = 1, m = 2
i++;               // i = 2, m = 2
i < m              // false

您会立即看到问题是循环体中的额外i++

对于第二个项目:

int i;              // i = ?
int m = 1;          // i = ?, m = 1
i = 0;              // i = 0, m = 1
i < m               // true
// first iteration
printf ("a");
i++;                // i = 1, m = 1
m = 5;              // i = 1, m = 5
i++;                // i = 2, m = 5
i < m               // true
// second iteration
printf ("a");
i++;                // i = 3, m = 5
m = 5;              // i = 3, m = 5
i++;                // i = 4, m = 5
i < m               // true
// third iteration
printf ("a");
i++;                // i = 5, m = 5
m = 5;              // i = 5, m = 5
i++;                // i = 6, m = 5
i < m               // false

再次,你可以看到为什么只有三次迭代。

你应该学习这个&#34;手工调试&#34;技术。确切了解程序中发生的情况非常有用。一旦你有了更多的经验,你就可以使用调试器,但这样做是个好主意。