面试题 ( ++a )和( a++ )

         /* 

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

原文地址:https://www.cnblogs.com/xyz123753/p/2609808.html