• 面试题 ( ++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.点击打开链接

  • 相关阅读:
    springcloud相关组件使用时的jar包
    day62-django-反向解析、路由分发、名称空间、伪静态、视图层(三板斧、JsonResponse、form表单上传文件、request对象方法、FBV与CBV)
    day61-django-数据的查改删、创建表关系 、请求生命周期流程图、路由层(路由匹配 无名分组 有名分组 无名有名是否可以混合使用 反向解析)
    AcWing487. 金明的预算方案题解(DP,分组背包)
    day60-django-静态文件配置、request方法、链接数据库、ORM操作
    day59-django-写一个简易版本的web框架、jinja2、web框架请求流程图、框架介绍、django基本操作
    day58-jQuery事件的阻止、委托、页面加载、动画、前端框架bootstrap、搭建图书管理系统
    day57-jQuery练习、操作标签、事件
    day56-js原生事件绑定-jQuery导入、查找标签
    day55-前端js-BOM与DOM操作
  • 原文地址:https://www.cnblogs.com/xyz123753/p/2609808.html
Copyright © 2020-2023  润新知