最近几天在看《 C P r i m e r P l u s C Primer Plus CPrimerPlus》的第五章——运算符、表达式和语句,看到思考题第八题的时候,发现了一个以前可能会忽略的点。
题目如下:
下面的程序将打印出什么内容?
//problem
#include<stdio.h>
int main()
{
int n = 0;
while (n++ <10)
{
printf("%d ", n);
}
return 0;
}
很显然,打印1到10 。
这个while循环是这样执行的:
先判断n的值是否小于10,再进行n+1,最后进行while的{ }中的语句。
相当于
//problem*
#include<stdio.h>
int main()
{
int n = 0;
while (n<10)
{
n++;
printf("%d ", n);
}
return 0;
}
而非
#include<stdio.h>
int main()
{
int n = 0;
while (n<10)
{
printf("%d ", n);
n++;
}
return 0;
}
注意上面两串代码 n++ 的位置的区别
当然,这是最基础的部分,但是我又想到,在while(n++…)的载体上,进行下面一段代码会怎么样呢?
//代码1
#include <stdio.h>
int main()
{
int n = 0;
while (n++ <10)
{
;
}
printf("%d\n", n);
return 0;
}
我在未运行这段代码前,想的是这段代码和下面一段代码是一样的:
//代码2
#include <stdio.h>
int main()
{
int n = 0;
while (n< 10)
{
n++;
}
printf("%d\n", n);
return 0;
}
然而,上面的“代码1”输出结果是11,“代码2”输出结果是10 。
我们来分析一下。
先看代码2:
最后一次进入循环时,n=9,执行完 n++ 出循环语句后n变为10,while中的 n<10 为假,执行printf函数。
但是代码1是这样执行的:
当 n=10 时,程序判定while的判断框中内容为假,但是程序先执行了 n++ ,再跳出循环,所以输出的值为11 。
以前认为“ problem ”和“ problem* ”是等价的,但是不是这样的,书真是常看常新啊。