A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 卞卞 中级黑马   /  2015-11-22 19:34  /  1511 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这个程序的输出结果是什么,帮忙分析一下。

main()

{int i=1

   printf("%d",i++);

   {int i=0;

    printf("%d",i++);

      }

    printf("%d,i++);

     }


12 个回复

倒序浏览
哥们,没报错嘛?在说你要输出那个啊
回复 使用道具 举报
本帖最后由 qq892384796 于 2015-11-22 22:21 编辑

楼主,你这段代码应该属于C语言代码,在Java中是不允许的,即便把所有函数替换为Java的格式,中间的那个大括号{}也就是普通代码块中,重新定义int i=0;Java语法是不支持的,会报该变量名已存在,不可以在重复定义i变量。
站在C语言的角度来看这道题主要考的是i++先运算再加加的特点,以及普通代码块变量的访问区域(就近原则)这两点。

最后的结果是 :1 0 2
程序从上往下以此看输出语句:
  1.第一个printf()打印i,i是后++运算,所以先打印1 ,后自增为2
  2.第二个printf()同int i=0;一样被一个普通代码块所包含,也就是说在该代码块中使用的i都是内部的i,与代码块外部的i无关(就近原则),所以此处也是后++,打印0,后内部i自增为1
  3.第三个printf()所打印的i,楼主要明白普通代码块中所定义的变量,外部是访问不到的,所以此处的i是1处运算后的i,既然也是后++,即结果为先打印2,再自增。

评分

参与人数 1技术分 +1 收起 理由
洋葱头头 + 1

查看全部评分

回复 使用道具 举报 1 0
赞赞赞赞
回复 使用道具 举报
这个东西真没看懂
回复 使用道具 举报
qq892384796 发表于 2015-11-22 22:17
楼主,你这段代码应该属于C语言代码,在Java中是不允许的,即便把所有函数替换为Java的格式,中间的那个大 ...

嗯对的,给你一个赞,谢谢
回复 使用道具 举报
Camwly 中级黑马 2015-11-22 22:56:23
7#
102,注意变量生命期就行了。
回复 使用道具 举报
卞卞 中级黑马 2015-11-22 23:00:11
8#
感觉论坛好多大神啊
回复 使用道具 举报
格式排列好一点会简单很多,这样吓着人了
回复 使用道具 举报
卞卞 中级黑马 2015-11-22 23:26:53
10#
隔壁马良 发表于 2015-11-22 23:07
格式排列好一点会简单很多,这样吓着人了

哦,不好意思我的错
回复 使用道具 举报
代码块之间使用栈保存,变量的调用永远优先使用栈顶的空间定义的同名的变量,首先是mian函数进栈,所以第一个输出结果为1,然后是代码块进栈,所以第二个输出结果为0;然后代码块出栈,栈中只剩下mian函数,所以输出结果为2
回复 使用道具 举报
102  ++在后面是赋值以后才加1的
回复 使用道具 举报
同意一楼回复,这道题考查两个知识点,自增自减运算和普通代码块变量的作用域的考查。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马