for循环中变量赋值与定义和执行顺序的问题

大家耐心把这篇文章看完一定会有收获。

先看下面这串十分简单的代码:

#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循环有这种特性,如果直接打个括号,括号内的变量也是局部变量,如果在括号外调用,也不能调用,会显示变量不存在。

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值