大家耐心把这篇文章看完一定会有收获。
先看下面这串十分简单的代码:
#include"stdio.h"
int main()
{
int t = 1;
int k = 1;
for (t = 0;k > 100;t++)
{
printf("阿巴阿巴");
}
printf("%d", t);
return 0;
}
我相信许多人会觉得这个for循环明显不符合循环条件,所以for循环可以直接跳过,最后打印输出的t值为1。
代码运行:
结果屏幕上打印了一个0。
为什么呢?这要从for循环的执行顺序讨论。for最开始会执行第一个分号前的赋值语句,然后在判断循环条件是否符合,若不符合就将循环break。但即使for循环break了,第一次执行的赋值语句并没有被消除,所以t变为了0。所以写for语句时,如果可以避免用重复的变量来进行循环操作,就避免。这也是vc++6.0编译多个循环语句时,如果监测到相同的变量就会报错的原因。编译器希望我们尽量避免这样的操作带来的可能隐藏的错误。
再看一串微改的代码:
#include"stdio.h"
int main()
{
int t = 1;
int k = 1;
for (int t = 0;k > 100;t++)
{
printf("阿巴阿巴");
}
printf("%d", t);
return 0;
}
可能有人又要说这个代码和上面没有多大区别,for循环执行了第一句话把t改为了0,所以最后屏幕上输出0。
代码运行:
结果屏幕上又打印了一个1。
这段代码唯一改动的地方就在于for循环里的t前加了一个int。而这个int的出现将for循环里的t定义为了局部变量。如果这个t为一个for循环里的局部变量(假设我们将它记为ft),那么它与之前的那个t就不是同一个t了,即此t非彼t。for循环执行的是将ft赋值为0,for循环结束后,将ft的内存空间释放,整个过程与t毫无瓜葛,所以最后打印输出t的值为1。
for循环中第一个语句定义变量就类似于定义函数时的形参,虽然名字可能相同,但不是一个变量。
不止for循环有这种特性,如果直接打个括号,括号内的变量也是局部变量,如果在括号外调用,也不能调用,会显示变量不存在。