关于自增自减,你真的懂了吗?

  1. int x =5 ;  printf("%d\n",x++);  printf("%d\n",++x);
  2. int x =5; printf("%d %d %d\n",++x,++x,++x);
  3. int x =5; printf("%d %d %d\n",x++,x++,x++);
  4. int x =5; printf("%d %d\n",++x,x++); 
  5. int x =5; printf("%d %d\n",x++,++x);
先提出以上问题,大家都能正确回答出来吗?(以自增为例)

1.

//声明:本程序在DevC++下测试 

#include <stdio.h>

int main()
{
	int x = 5;
	printf("%d\n",x++);			//单独输出这一句, 结果为5 (先用再加,用后再加) 
	printf("%d\n",++x);			//单独输出这一句, 结果为6 	(先加再用,现加现用)
	return 0;
}
//申明:本程序演示于VC++6.0下

#include <stdio.h>
int main()
{

	int x = 5;
	printf("%d\n",x++);								//该句单独执行,结果为 5				
	printf("%d\n",++x);								//该句单独执行,结果为 6
	return 0;
}

结论:由上可知,只要正确了前置自增和后置自增的区别,DevC++和VC++6.0下程序的表现并无不同。

2.

//声明:本程序在DevC++下测试 

#include <stdio.h>

int main()
{
	int x = 5;
	printf("%d %d %d\n",++x,++x,++x);		//单独输出这一句,结果为 8 8 8(注意,与VC++6.0下的结果不同)
	return 0;
}

//申明:本程序演示于VC++6.0下

#include <stdio.h>
int main()
{

	int x = 5;
	printf("%d %d %d\n",++x,++x,++x);				//该句单独执行,结果为8 7 6
	return 0;
}

显然,同一个程序在两个不同的编译器下结果不同,这是为什么那?别急,你要是看完我接下来的代码,或许你会认同我的观点。

//声明:本程序在DevC++下测试 

#include <stdio.h>

int main()
{
	int x = 5;
	int temp1; 						//注意:printf()函数的调用约定是从右向左 
	temp1 = ++x;
	temp1= ++temp1;
	temp1 = ++temp1;
	printf("%d %d %d\n",temp1,temp1,temp1); 	//输出结果为8 8 8			
											 
	return 0;
}

3

//声明:本程序在DevC++下测试 

#include <stdio.h>

int main()
{
	int x = 5;
	printf("%d %d %d\n",x++,x++,x++);		//单独输出这一句,结果为 7 6 5 (与VC++6.0下结果不一样) 			
											 
	return 0;
}

//申明:本程序演示于VC++6.0下

#include <stdio.h>
int main()
{

	int x = 5;
	printf("%d %d %d\n",x++,x++,x++); 			//该句单独执行,结果为5 5 5
	return 0;
}
这里,同一个程序在两个不同的编译器下结果也不同,这又是为什么那? 也许我下面的过程分析能帮到你。

//申明:本程序演示于VC++6.0下

#include <stdio.h>
int main()
{
	int x = 5;
						//注意:printf函数的执行 类似于栈的原理
	int temp1,temp2,temp3,temp4,temp5;
	temp1 = x++;
	temp4 = temp1;	//暂存temp1的值
	temp2 = temp1++;
	temp5 = temp2;	//暂存temp2的值
	temp3 = temp2++;
	printf("%d %d %d\n",temp3,temp5,temp4);		//输出结果为5 5 5
	return 0;
}

4

//声明:本程序在DevC++下测试 

#include <stdio.h>

int main()
{
	int x = 5;
	printf("%d %d\n",++x,x++); 			//单独输出这一句,结果为7 5		(与VC++6.0下结果不一样) 			
											 
	return 0;
}

//申明:本程序演示于VC++6.0下

#include <stdio.h>
int main()
{
	int x = 5;
	printf("%d %d\n",++x,x++);		//该句单独执行,结果为6 5 
	return 0;
}


不同?不同?为什么?当然是由于编译器的处理不一样了。下面是我的演示。
//申明:本程序演示于VC++6.0下

#include <stdio.h>
int main()
{
	int x = 5;
	int temp1,temp2,temp3;
	temp3 = x;			//暂存x的值 
	temp1 = x++;
	temp2 = ++temp1;
	printf("%d %d",temp2,temp3);
	return 0;
}
//该程序的输出结果为6 5
5

//声明:本程序在DevC++下测试 

#include <stdio.h>

int main()
{
	int x = 5;
	printf("%d %d\n",x++,++x);				//单独输出这一句,结果为6 7	(与VC++6.0下结果不同)
											 
	return 0;
}

//申明:本程序演示于VC++6.0下

#include <stdio.h>
int main()
{
	int x = 5;
	printf("%d %d\n",x++,++x);			//该句单独执行,结果为6 6
	return 0;
}

对此,以下是我的Demo.

//声明:本程序在DevC++下测试 

#include <stdio.h>

int main()
{
	int x = 5;
	int temp1,temp2;
	temp1 = ++x;
	temp2 = temp1++;
	printf("%d %d",temp2,temp1);			//输出结果为6 7 (Devc++下也许就是这样处理的)
											 
	return 0;
}

//申明:本程序演示于VC++6.0下

#include <stdio.h>
int main()
{
	int x = 5;
	int temp1,temp2,temp3;
	temp1 = ++x;
	temp3 = temp1;		//暂存temp1的值 
	temp2 = temp1++;
	printf("%d %d",temp2,temp3); 			//输出结果为6 6 
	return 0;
}

写到这里,你们也看累了吧,至此,5个问题到分析完了,你发觉了什么?除了要明白前置自增与后置自增的区别,还要知道VC++6.0下处理过程中保存了多个暂存值。

还有续集,自己的看法,如有不对,大家请提出来。



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值