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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天朋友看到了个帖子,问
int x =5;
x=x+(x++)+(++x);
后x的值是多少?
我看了之后口算了一下告诉他19,他说不是的,是17,于是我蛋疼的求证了一下。

评分

参与人数 1技术分 +2 收起 理由
Doraemon + 2

查看全部评分

46 个回复

倒序浏览
5+5+7,,,,第二步5先赋值,之后自增变成6,之后再自增成7然后赋值,,,所以是17
回复 使用道具 举报
首先是在java中,确实是17
f:\\1.jpg

1.jpg (12.28 KB, 下载次数: 69)

1.jpg
回复 使用道具 举报
然后是javascript中,也是17

725fdbc8a786c917abe492aacb3d70cf39c757d0.jpg (22.3 KB, 下载次数: 64)

725fdbc8a786c917abe492aacb3d70cf39c757d0.jpg
回复 使用道具 举报
肯定是17了,5+6+6
回复 使用道具 举报
然后让人不解问题就来了。
在微软的vc++中,居然是19

5e944090f603738db7f3cfb1b11bb051f919ec7a.jpg (14.77 KB, 下载次数: 44)

5e944090f603738db7f3cfb1b11bb051f919ec7a.jpg
回复 使用道具 举报
更逗的是,在MinGW(gcc的windows实现)中,居然是18

5e944090f603738db7f3cfb1b11bb051f919ec7a.jpg (13.44 KB, 下载次数: 46)

5e944090f603738db7f3cfb1b11bb051f919ec7a.jpg
回复 使用道具 举报
而在原生gcc(这里用的是Ubuntu)下,是17

b5f3da160924ab18613c23a437fae6cd7a890b95.jpg (23.85 KB, 下载次数: 33)

b5f3da160924ab18613c23a437fae6cd7a890b95.jpg
回复 使用道具 举报
汉谟拉比 发表于 2014-7-12 21:18
5+5+7,,,,第二步5先赋值,之后自增变成6,之后再自增成7然后赋值,,,所以是17 ...

‘呵呵,看下边,有好玩的
回复 使用道具 举报
路过走走
回复 使用道具 举报

5+6+6  是17;P
回复 使用道具 举报
x=x+(x++)+(++x);
   5+5+7
结果17嘛。
回复 使用道具 举报
6+5+6=17  我想是这样的
回复 使用道具 举报
运算符的优先级(从高到低)
  
优先级
  
  
描述
  
  
运算符
  
  
1
  
  
括号
  
  
()、[]
  
  
2
  
  
正负号
  
  
+、-
  
  
3
  
  
自增自减,非
  
  
++、--、!
  
  
4
  
  
乘除,取余
  
  
*、/、%
  
  
5
  
  
加减
  
  
+、-
  
  
6
  
  
移位运算
  
  
<<、>>、>>>
  
  
7
  
  
大小关系
  
  
>、>=、<、<=
  
  
8
  
  
相等关系
  
  
==、!=
  
  
9
  
  
按位与
  
  
&
  
  
10
  
  
按位异或
  
  
^
  
  
11
  
  
按位或
  
  
|
  
  
12
  
  
逻辑与
  
  
&&
  
  
13
  
  
逻辑或
  
  
||
  
  
14
  
  
条件运算
  
  
?:
  
  
15
  
  
赋值运算
  
  
=、+=、-=、*=、/=、%=
  
  
16
  
  
位赋值运算
  
  
&=、|=、<<=、>>=、>>>=
  

如果在程序中,要改变运算顺序,可以使用()
由该表可以得到先算括号里面的,结果是5+6+6=17.

QQ截图20140712220500.png (126.26 KB, 下载次数: 33)

QQ截图20140712220500.png
回复 使用道具 举报
一十二。 发表于 2014-7-12 21:21
然后让人不解问题就来了。
在微软的vc++中,居然是19

这很正常。在C和C++中,没有规定表达式的求值顺序。对于x+(x++)+(++x);到底是先算x还是先算x++还是先算++x,取决于编译器,编译器高兴,怎么算都可以,只要不违背运算符的优先级和结合性(http://bbs.itheima.com/thread-128465-1-1.html)。但是Java在设计之初就力求严谨,去掉C和C++中诸多模棱两可的特性。求值顺序就是其中之一。Java语言规范明确了表达式求值顺序一定是从左到右
回复 使用道具 举报 1 0
http://c-faq-chn.sourceforge.net/ccfaq/node39.html 看这里看这里
回复 使用道具 举报
hxwo211314 发表于 2014-7-12 22:07
运算符的优先级(从高到低)
如果在程序中,要改变运算顺序,可以使用()。
由该表可以得到先算括号里面的 ...

X++不是=5吗 然后X变6了 ++X成了7
557不是么?
回复 使用道具 举报
双皮奶 发表于 2014-7-12 21:59
6+5+6=17  我想是这样的

6+5+6=17 真的是17么?   5+5+7  是这样的
回复 使用道具 举报

你笑的太恶心了
回复 使用道具 举报
一十二。 发表于 2014-7-12 22:19
6+5+6=17 真的是17么?   5+5+7  是这样的

http://c-faq-chn.sourceforge.net/ccfaq/node38.html
http://c-faq-chn.sourceforge.net/ccfaq/node44.html
http://c-faq-chn.sourceforge.net/ccfaq/node39.html
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马