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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王舜民 于 2012-8-26 10:07 编辑

这几天上java基础班碰到好多问题
int a =10;
(a++)+(++a)+(a--)*3+(--a)=
这个我知道是这样的
10+12+36+10=68
但是我不知道为什么有了括号( )  a++后,就能自增。
c中的答案会随着编译器不同,结果也会有变化。这是个,我一直搞不清楚的问题。
求高手解答一下java中的++问题,最好也讲一下c中的,两者有什么区别呢?

但是
int i = 3;
        i = i++;
        System.out.println("i="+i);//i是?
我认为是4,但是运行结果是3。为什么?

15 个回复

倒序浏览
对于前缀递增和前缀递减(如++a或--a),会先执行运算,再生成值。而对于后缀递增和后缀递减(如a++或a--),会先生成值,再执行运算。
递增操作符正是对c++这个名字的一种解释,暗示着“超越C一步”
回复 使用道具 举报
杨鹏鹏 发表于 2012-8-25 00:04
对于前缀递增和前缀递减(如++a或--a),会先执行运算,再生成值。而对于后缀递增和后缀递减(如a++或a--) ...

我也知道++a会先运算,a++后运算。但是就是不懂那个()和
  i = i++;
        System.out.println("i="+i);
回复 使用道具 举报
本帖最后由 寇龙飞 于 2012-8-25 00:29 编辑

拿着解释要去不断的敲代码验证,就懂了。

个人感觉c++与java中对于++、--是一致的
  1. int i = 3;
  2.         i = i++;
  3.         System.out.println("i="+i);//i是?
复制代码
i = i++;  这句有2个运算符,你要懂它的运算顺序,++自增优先于=赋值,所以先进行i++自增,此时i是4,
同时i++这个表达式的值却是3
,然后进行=赋值,自然是把这个i++表达式的值3赋给i了,i值重新成为3了

记得毕老师的视频开头说,狂敲代码!   那练好基础,让它怎么变化你都能应付了。


ps.刚才笔误,重新编辑了下。

点评

厉害,这个我也想不通。看了你说的才明白。  发表于 2012-8-26 07:53

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 犀利哥,很给力!吼吼!

查看全部评分

回复 使用道具 举报
前缀和后缀的自增与自减,沙发已经解释了,
int i=3;
i=i+1;
先把i=3的值赋值给i;然后i的值再自增1
打印输出的i值是自增前的值,所以打印的是3咯

回复 使用道具 举报
寇龙飞 发表于 2012-8-25 00:22
拿着解释要去不断的敲代码验证,就懂了。

个人感觉c++与java中对于++、--是一致的i = i++;  这句有2个运算 ...

就是说输出语句没有对这个i有影响?
我知道了
回复 使用道具 举报
史龙贤 黑马帝 2012-8-25 00:44:48
7#
有了括号以后,就相当于求得自增以后的值了。比如int a=3;  a=a+3 等效于(a++).
如果符号在变量的前面就那么这个变量就会先自增然后再把自己的值赋给变量
如果符号在后面,那么这个变量就会先把自己的值赋给变量,然后自己再自增。

回复 使用道具 举报
本帖最后由 寇龙飞 于 2012-8-25 00:49 编辑
王舜民 发表于 2012-8-25 00:31
就是说输出语句没有对这个i有影响?
我知道了


输出语句
  1. System.out.println("i="+i);
复制代码
对i的影响就是字符串String"i+"与int变量i(值为3)进行+运算,强制类型转换,int-3类型被提升为String-“3”,输出结果应该是字符串:i=3

这个影响你可以暂时不用考虑,输出语句等价于:
  1. System.out.print("i=");
  2. System.out.println(i);
复制代码
回复 使用道具 举报
哥们,咱不要搞那么容易误解的i
int i=3;        i=i++;        System.out.print("i="+i);
打印的i,咱们换个变量名a就好理解了。int i=3; a=i++; System.out.print("i="+a);
a=i++和a=++i
这两个表达式,运行完了,有一个共同点就是,i都会自增1,我说的是运行完了之后,i=i+1;
不同的是:a=i++运行完之后,a的值是没有自增之前的i,即a=i,i=i+1。这个是有执行顺序的,就是先对i自增,再赋值给a,赋的值是i没有自增之前的值。
而a=++i运行完之后,a的值是自增之后的i,即i=i+1,a=i。同样先对i自增,再赋值给a,赋的值是自增后的i值。
i=i++;就是把没有自增的i值赋给i,意思就是说i本来已经自增为4了,后来又把没自增之前的3赋给了i,i就成了3。
输出语句中的+是连接符,不是运算符,如System.out.print("p的名字"+p.name)

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
张锐(山西) 发表于 2012-8-25 08:17
哥们,咱不要搞那么容易误解的i
int i=3;        i=i++;        System.out.print("i="+i);
打印的i,咱们 ...

3q!谢谢!
回复 使用道具 举报
张锐(山西) 发表于 2012-8-25 08:17
哥们,咱不要搞那么容易误解的i
int i=3;        i=i++;        System.out.print("i="+i);
打印的i,咱们 ...


可以这么理解吗?

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
详细给你说说
首先
a++  是a参与运算之后再自增
++a  是a先自增再参与运算
a=10
b=++a   则b=11  a=11
b=a++   则b=10  a=11
针对你的题目
(1)a++ 说明a先参与元算再自增
   10+(++a)+(a--)*3+(--a)
   a=10+1=11
(2)++a  a先自增再参与运算
   a=11+1=12
   10+12+(a--)*3+(--a)
(3)a--  a先参与运算再自减
   10+12+12*3
   a=12-1=11
(4)--a a先自减再参与运算
   a=11-1=10
   10+12+12*3+10=68


回复 使用道具 举报
int i = 3;
        i = i++;
        System.out.println("i="+i);//i是?

输出结果是3;
这个结果跟运算符的优先级有关,++ 运算符比=(赋值)运算符要高,所以一开始运算,++先进行运算。但在i ++运算前,内存中会先开辟一个临时空间,用来存储i 的值3;随后i 进行++运算,变为4;最后再将临时空间的3 赋值给i ,所以最后输出结果是3
回复 使用道具 举报
谢谢各位!
已解决!
回复 使用道具 举报
王舜民 发表于 2012-8-25 19:21
可以这么理解吗?

对,就这么理解。
回复 使用道具 举报
张锐(山西) 发表于 2012-8-26 10:03
对,就这么理解。

这问题之前我只记结果别人问我就不知道怎么回事,所以来问一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马