黑马程序员技术交流社区

标题: x++,++x 问题,超神级贴,进来看看你知道么 [打印本页]

作者: 一十二。    时间: 2014-7-12 21:12
标题: x++,++x 问题,超神级贴,进来看看你知道么
今天朋友看到了个帖子,问
int x =5;
x=x+(x++)+(++x);
后x的值是多少?
我看了之后口算了一下告诉他19,他说不是的,是17,于是我蛋疼的求证了一下。
作者: 汉谟拉比    时间: 2014-7-12 21:18
5+5+7,,,,第二步5先赋值,之后自增变成6,之后再自增成7然后赋值,,,所以是17
作者: 一十二。    时间: 2014-7-12 21:19
首先是在java中,确实是17
f:\\1.jpg

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

1.jpg

作者: 一十二。    时间: 2014-7-12 21:20
然后是javascript中,也是17

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

725fdbc8a786c917abe492aacb3d70cf39c757d0.jpg

作者: 王飞163    时间: 2014-7-12 21:20
肯定是17了,5+6+6
作者: 一十二。    时间: 2014-7-12 21:21
然后让人不解问题就来了。
在微软的vc++中,居然是19

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

5e944090f603738db7f3cfb1b11bb051f919ec7a.jpg

作者: 一十二。    时间: 2014-7-12 21:23
更逗的是,在MinGW(gcc的windows实现)中,居然是18

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

5e944090f603738db7f3cfb1b11bb051f919ec7a.jpg

作者: 一十二。    时间: 2014-7-12 21:24
而在原生gcc(这里用的是Ubuntu)下,是17

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

b5f3da160924ab18613c23a437fae6cd7a890b95.jpg

作者: 一十二。    时间: 2014-7-12 21:25
汉谟拉比 发表于 2014-7-12 21:18
5+5+7,,,,第二步5先赋值,之后自增变成6,之后再自增成7然后赋值,,,所以是17 ...

‘呵呵,看下边,有好玩的
作者: 淡淡柠檬茶    时间: 2014-7-12 21:26
路过走走
作者: 一十二。    时间: 2014-7-12 21:27
王飞163 发表于 2014-7-12 21:20
肯定是17了,5+6+6

5+6+6  是17;P
作者: 黎志勇    时间: 2014-7-12 21:29
x=x+(x++)+(++x);
   5+5+7
结果17嘛。
作者: 双皮奶    时间: 2014-7-12 21:59
6+5+6=17  我想是这样的
作者: hxwo211314    时间: 2014-7-12 22:07
运算符的优先级(从高到低)
  
优先级
  
  
描述
  
  
运算符
  
  
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, 下载次数: 64)

QQ截图20140712220500.png

作者: fantacyleo    时间: 2014-7-12 22:11
一十二。 发表于 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语言规范明确了表达式求值顺序一定是从左到右
作者: 双皮奶    时间: 2014-7-12 22:15
http://c-faq-chn.sourceforge.net/ccfaq/node39.html 看这里看这里
作者: 郑飞    时间: 2014-7-12 22:17
hxwo211314 发表于 2014-7-12 22:07
运算符的优先级(从高到低)
如果在程序中,要改变运算顺序,可以使用()。
由该表可以得到先算括号里面的 ...

X++不是=5吗 然后X变6了 ++X成了7
557不是么?
作者: 一十二。    时间: 2014-7-12 22:19
双皮奶 发表于 2014-7-12 21:59
6+5+6=17  我想是这样的

6+5+6=17 真的是17么?   5+5+7  是这样的
作者: 郑飞    时间: 2014-7-12 22:20
一十二。 发表于 2014-7-12 21:27
5+6+6  是17

你笑的太恶心了
作者: 双皮奶    时间: 2014-7-12 22:27
一十二。 发表于 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

作者: hxwo211314    时间: 2014-7-12 22:29
郑飞 发表于 2014-7-12 22:17
X++不是=5吗 然后X变6了 ++X成了7
557不是么?

题目是:
x = 5;不是x++ = 5.
作者: 渴望学习    时间: 2014-7-12 22:30
黎志勇 发表于 2014-7-12 21:29
x=x+(x++)+(++x);
   5+5+7
结果17嘛。

同意你的 5+5+7
作者: fantacyleo    时间: 2014-7-12 22:31
hxwo211314 发表于 2014-7-12 22:07
运算符的优先级(从高到低)
如果在程序中,要改变运算顺序,可以使用()。
由该表可以得到先算括号里面的 ...

括号和优先级跟运算顺序没有关系
作者: 渴望学习    时间: 2014-7-12 22:32
郑飞 发表于 2014-7-12 22:20
你笑的太恶心了

同意!!!
作者: 郑飞    时间: 2014-7-12 22:46
hxwo211314 发表于 2014-7-12 22:29
题目是:
x = 5;不是x++ = 5.

题目是X=5
我说的是表达式里面的值
作者: ╰_〃无法释怀的    时间: 2014-7-12 22:54
是17了....
作者: lancerjs    时间: 2014-7-12 23:15
本帖最后由 lancerjs 于 2014-7-12 23:21 编辑

计算过程应该是5+5+7在Java中,若将顺序调换为(x++) + (++x) + x ,则结果为19,可知Java中是先计算第一个加号,然后x自加1,然后x再自加1,然后计算第二个加号

作者: xiaogh    时间: 2014-7-12 23:18
5 + 5(++在x后面,先运算在自增,x就等于6了) + 7(++在前面,先自增,x=7,在运算) = 17
作者: huanglyhf    时间: 2014-7-13 09:49
编个程序算一下不就知道了
作者: Adjin    时间: 2014-7-13 11:15
应该是5+5+7?
作者: cheye0207    时间: 2014-7-13 13:40
应该是这样的吧。。。。5+5+(1+6)
作者: SLJ_920808    时间: 2014-7-13 13:47
++x是先加后赋值,x++是先赋值后加。
作者: 郑飞    时间: 2014-7-13 14:17
class Test
{
        public static void main(String args[])
                {
                        int x =5;
                        System.out.println(x=x);
                        x=5;
                        System.out.println(x=x+(x++));
                        x=5;
                        System.out.println(x=x+(x++)+(++x));       
                }
}
试了下 结果是 5  10  17
作者: flyidea    时间: 2014-7-13 15:08
5+5,等于了10,之后5变成6,在后来6先变成7再相加,10+7=17.
作者: e644638045    时间: 2014-7-13 17:43
我怎么算的是21啊
作者: fengzheng    时间: 2014-7-13 18:07
结果是5+6+6,还是5+5+7?我想的是5+6+6。晕了
作者: 格子、    时间: 2014-7-13 20:49
5+5+7=17,没什么好解释的。。。
作者: 韩天雷    时间: 2014-7-13 20:58
这要看编译器的
作者: ss5619498    时间: 2014-7-13 20:58
不是这样的吧!!!、
哪是5+5+7,汗
第一步是5+5+6然后赋值给左边的X
然后做X++
既16+1=17
根本就不是5+5+7
过程不对
作者: 道本真    时间: 2014-7-18 22:40
。。。。这,不算是一个BUG吗
作者: jyc2511    时间: 2014-7-21 00:46
ss5619498 发表于 2014-7-13 20:58
不是这样的吧!!!、
哪是5+5+7,汗
第一步是5+5+6然后赋值给左边的X

注意有()啊,运算顺序
作者: jyc2511    时间: 2014-7-21 00:47
jyc2511 发表于 2014-7-21 00:46
注意有()啊,运算顺序

5+5+(6自增1=7)=17的运算顺序应该是正确的
作者: jyc2511    时间: 2014-7-21 00:50
hxwo211314 发表于 2014-7-12 22:07
运算符的优先级(从高到低)
如果在程序中,要改变运算顺序,可以使用()。
由该表可以得到先算括号里面的 ...

总结的不错啊:handshake
作者: 渠嘉树    时间: 2014-7-21 01:06
17   就是有点绕
作者: M单色调    时间: 2014-7-21 07:13
在不进行赋值运算的时候,他们的功能都是一样的,只有在赋值的时候。。。
作者: heimacs    时间: 2014-7-21 07:22
学习下。
作者: blz01003hm    时间: 2014-7-21 10:14
感觉是 5+5+6=16,再自增一,17




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2