关于华为一道面试题 ( ++a )和( a++ ) .

关于华为一道面试题 ( ++a )和( a++ )

 

    昨天偶尔在网上看到一道华为面试题,觉得有点无语,这么NB的公司也出这种没有意义的题目,唉~~~话不多说,贴上代码:

     上面还有我自己的解释:


  1. /* 
  2.     这个例子主要是考虑到a++和++a的存储问题; 
  3.     我们知道,对于a++是先将a给表达式再++; 
  4.     那么这就是需要一个tmp空间来保存++之前 
  5.     的a!!!但是对于++a是不需要的,因为先 
  6.     执行++,那么就是直接改a空间内容就好了! 
  7.     那么我们下面的问题就是这样! 
  8. */  
  9.   
  10. #include <stdio.h>   
  11.   
  12. int main()  
  13. {  
  14.   
  15.     int a = 4;  
  16.   
  17.     /* 
  18.         解释:下面的答案在Linux和VC下测试是9; 
  19.         如果这样的形式不好看,那么写成这样就 
  20.         可以了:a = a + ( a++ ); 
  21.         那么由于a++是先把数放到tmp空间再++; 
  22.         所以,执行顺序:把后面a放进tmp空间,然后 
  23.         a的存储空间数++,那么现在a中是5,tmp中是4 
  24.         最后a = a + tmp;所以最终结果==9 
  25.     */  
  26.     a += ( a++ );                 
  27.     printf("a = %d\n\n", a);  
  28.       
  29.   
  30.   
  31.     /* 
  32.         解释:这里和上面的区别就是++先后执行的 
  33.         问题,执行顺序:先a++,那么此时的a中就是 
  34.         5了,然后将这个结果也放进一个tmp空间, 
  35.         最后在相加,那么结果就是:5 + 5 == 10 
  36.     */  
  37.     a = 4;  
  38.     a += ( ++a );  
  39.     printf("a = %d\n\n", a);  
  40.       
  41.   
  42.     /* 
  43.         注意:下面的代码编译是通过不了的哦!为什么? 
  44.         其实自最开始已经解释了!就是有没有tmp的问题! 
  45.         注意a++是先把a给表达式,再++,那么对于左边 
  46.         来说,其实给的存储空间是tmp而并不是a本身,对于 
  47.         tmp来说是不可以被赋值的,只能是作为输入操作!! 
  48.         所以。。。 
  49.     */  
  50.   
  51.     /* 
  52.     a = 4; 
  53.     (a++) += a; 
  54.     printf("a = %d\n\n", a); 
  55.     */  
  56.   
  57.   
  58.     /* 
  59.         这个本质其实也是差不多的; 
  60.         就是先有了++a放到a中了,那么相当于是a的初 
  61.         始值是5,然后在执行:a += ( a++ );那么结果 
  62.         就是11呗,呵呵~ 
  63.     */  
  64.     a = 4;  
  65.     ( ++a ) += ( a++ );  
  66.     printf("a = %d\n\n", a);  
  67.           
  68.     return 0;  
  69. }  
/*
	这个例子主要是考虑到a++和++a的存储问题;
	我们知道,对于a++是先将a给表达式再++;
	那么这就是需要一个tmp空间来保存++之前
	的a!!!但是对于++a是不需要的,因为先
	执行++,那么就是直接改a空间内容就好了!
	那么我们下面的问题就是这样!
*/

#include <stdio.h>

int main()
{

	int a = 4;

	/*
		解释:下面的答案在Linux和VC下测试是9;
		如果这样的形式不好看,那么写成这样就
		可以了:a = a + ( a++ );
		那么由于a++是先把数放到tmp空间再++;
		所以,执行顺序:把后面a放进tmp空间,然后
		a的存储空间数++,那么现在a中是5,tmp中是4
		最后a = a + tmp;所以最终结果==9
	*/
	a += ( a++ );				
	printf("a = %d\n\n", a);
	


	/*
		解释:这里和上面的区别就是++先后执行的
		问题,执行顺序:先a++,那么此时的a中就是
		5了,然后将这个结果也放进一个tmp空间,
		最后在相加,那么结果就是:5 + 5 == 10
	*/
	a = 4;
	a += ( ++a );
	printf("a = %d\n\n", a);
	

	/*
		注意:下面的代码编译是通过不了的哦!为什么?
		其实自最开始已经解释了!就是有没有tmp的问题!
		注意a++是先把a给表达式,再++,那么对于左边
		来说,其实给的存储空间是tmp而并不是a本身,对于
		tmp来说是不可以被赋值的,只能是作为输入操作!!
		所以。。。
	*/

	/*
	a = 4;
	(a++) += a;
	printf("a = %d\n\n", a);
	*/


	/*
		这个本质其实也是差不多的;
		就是先有了++a放到a中了,那么相当于是a的初
		始值是5,然后在执行:a += ( a++ );那么结果
		就是11呗,呵呵~
	*/
	a = 4;
	( ++a ) += ( a++ );
	printf("a = %d\n\n", a);
		
	return 0;
}

run:

g++ -o test test.cpp

./test


但是对于临时空间为什么不可以作为左操作数呢?也就是说为什么不可以赋值呢?查查看~~~

我们必须要知道的临时变量空间对于编译器来说是”未定式“,是不可被赋值的,为了更进一步学习,给两个链接:

1. a++之类问题

2.点击打开链接



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值