MyException - 我的异常网
当前位置:我的异常网» 编程 » fun(++i, i, i++, i++)有关问题

fun(++i, i, i++, i++)有关问题

www.myexceptions.net  网友分享于:2015-01-18  浏览:0次
fun(++i, i, i++, i++)问题

这是几个月前一个学弟问我的问题,应该是c2级上的一个选择题,还是蛮有意思的,而且网上是没有这个题的答案的,题目是这样的

public class Demo{
  public static void fun(a,b,c,d){
    System.out.println(a);
    System.out.println(b);
    System.out.println(c);
    System.out.println(d);
  }
  public static void main(String[] args){
   int i=1;
   fun(++1,i,i++,i++);
  }
}

输出结果是:4,4,2,1 肯定想不到吧。计算步骤如下:

首先是明确2个问题
1.函数的执行顺序为从右到左执行
2.参数计算结果后并不会马上返回计算结果,而是等所有值都计算以后再返回结果。

如第一题:
fun(++i, i, i++, i++)
//-------------------------------------------计算阶段---------------------------------------------------

1).i++; (当时i=1)	由于是i++ 所以会将该值保存到内存中 最后会返回该内存中的值 第四个参数d=1
2).i++;	(当时i=2)	由于是i++ 所以会将该值保存到内存中 最后会返回该内存中的值 第三个参数c=2
3).i;	(当时i=3)	由于是i 所以不会记录到内存中 最后会直接返回i值
4).++i;	(当时i=4)	由于是++i 程序会在i的基础上+1 并返回i值 所以不会记录到内存中 最后会直接返回i值

//-------------------------------------------返回计算结果阶段---------------------------------------------------

5).返回第四个参数	返回1)中内存地址中的值 d=1	
6).返回第三个参数	返回2)中内存地址中的值 c=2	
7).返回第二个参数	返回i值 b=4
8).返回第一个参数	返回i值 a=4

不过他还有一道衍生题main函数中调用fun函数中传递的参数变成这样:fun(++i, i++, i++, ++i);

解题思路如下:

第二题:
fun(++i, i++, i++, ++i);
//-------------------------------------------计算阶段---------------------------------------------------

1).++i; (当时i=2)	由于是++i 程序会在i的基础上+1 并返回i值 所以不会记录到内存中 最后会直接返回i值
2).i++;	(当时i=2)	由于是i++ 所以会将该值保存到内存中 最后会返回该内存中的值 第三个参数c=2
3).i++;	(当时i=3)	由于是i++ 所以会将该值保存到内存中 最后会返回该内存中的值 第三个参数b=3
4).++i;	(当时i=5)	由于是++i 程序会在i的基础上+1 并返回i值 所以不会记录到内存中 最后会直接返回i值

//-------------------------------------------返回计算结果阶段---------------------------------------------------

5).返回第四个参数	返回i值 d=5	
6).返回第三个参数	返回2)中内存地址中的值 c=2	
7).返回第二个参数	返回3)中内存地址中的值 b=3
8).返回第一个参数	返回i值 a=5

虽然实例是用java写的,实际运行环境其实是c++,至于为啥。因为vs有反汇编啊。这题单步跟踪调试绝对一头雾水,反汇编反而一目了然。

1楼Jian_2昨天 16:19
把你的程序用eclipse测试了一番,结果是2,2,2,3,估计是每个编译器的执行顺序不一样…

文章评论

程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
我的丈夫是个程序员
我的丈夫是个程序员
 程序员的样子
程序员的样子
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员必看的十大电影
程序员必看的十大电影
老程序员的下场
老程序员的下场
我是如何打败拖延症的
我是如何打败拖延症的
如何成为一名黑客
如何成为一名黑客
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
编程语言是女人
编程语言是女人
那些争议最大的编程观点
那些争议最大的编程观点
一个程序员的时间管理
一个程序员的时间管理
程序员应该关注的一些事儿
程序员应该关注的一些事儿
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员都该阅读的书
程序员都该阅读的书
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
鲜为人知的编程真相
鲜为人知的编程真相
为什么程序员都是夜猫子
为什么程序员都是夜猫子
漫画:程序员的工作
漫画:程序员的工作
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
总结2014中国互联网十大段子
总结2014中国互联网十大段子
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
Java程序员必看电影
Java程序员必看电影
每天工作4小时的程序员
每天工作4小时的程序员
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员的鄙视链
程序员的鄙视链
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
代码女神横空出世
代码女神横空出世
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有