黑客X档案官方论坛's Archiver

yofx 发表于 2008-3-13 22:46

一道C题

详细代码就不写出来。

   具体 运算我写出来
  m=2 j=2

  m+=(j++)+(++j)+(++j)

  M最后结果为 11

   关于这道题的具体 思考过程 一直不太明白。今天N多人一起讨论(才接触C)
  没有一个人的解释力排众议…………


   今天找老师问 他的解释是

  j++ 和 ++j也有优先级。
  ++J优先与j++
所以先执行++j   所有 就是 3+3+3 +2。。。
   还是很疑惑到底是怎么回事。

[[i] 本帖最后由 yofx 于 2008-3-14 10:58 编辑 [/i]]

829939 发表于 2008-3-14 00:01

m=2 j=2

  m+=(j++)+(++j)+(++j)

主要考虑好前加后加的问题。是先运算还是先自加。

第一个个括号内 j 是后加,第二个括号内 j 是前加
    所以 前两个括号相加完后   结果是 2+3=5 ,j 此刻为4。
5+(++j) = 9 。
然后 m+=9 = 11 了。

编程小猪 发表于 2008-3-14 00:40

j加了三次,最终应该是5,所以应该是2+4+5=11
m+=11
m就该是13,我想楼主是不明白这一点。

xiaoyelang 发表于 2008-3-14 11:45

14的吧~~~~~~~

m=2 j=2

  m+=(j++)+(++j)+(++j)
首先(j++)==3,然后(++j)==4,再(++j)==5;
所以 m+=(j++)+(++j)+(++j)=m+3+4+5=14

dingqi2006 发表于 2008-3-14 21:45

(j++)是2  (++j)是3 (++j)是4
在加2 =11

lifeng 发表于 2008-3-14 22:35

是等于13,(j++)=3
再(++j)=4
再(++j)=5
m再自加=13
::18::

megadeath 发表于 2008-3-14 22:48

[quote]原帖由 [i]yofx[/i] 于 2008-3-13 22:46 发表 [url=http://bbs.hackerxfiles.net/redirect.php?goto=findpost&pid=732788&ptid=98541][img]http://bbs.hackerxfiles.net/images/common/back.gif[/img][/url]

   今天找老师问 他的解释是

  j++ 和 ++j也有优先级。
  ++J优先与j++
所以先执行++j   所有 就是 3+3+3 +2。。。
   还是很疑惑到底是怎么回事。
... [/quote]

类似m+=(j++)+(++j)+(++j); 这样的写法,只会出现在考试题中,就像孔已己讨论那茴香豆的“茴”字的四种写法一样没有任何意义。

前缀++和后缀++的优先级的确不同,但不是你们老师说的那样,前缀优先于后缀,正好相反,后缀优先于前缀,结合性两者完全相反。可以到以下网址查看符号的优先级和结合性。
http://www.cppreference.com/operator_precedence.html

在不同的编译器上计算出来的m值也大相径庭,例如在gcc v4.1.4 中,m最终为12,而在VC9中m为14,编译器对标注支持得不同的话结果也不同,因此这题目根本没有标准的答案,出题人纯粹在玩文字游戏。

深恶痛绝这种写法,滥用C语法而混淆了语意,曾经发誓,若在公司项目中若有人写下类似这样的代码,直接视为脑残,开除而后快。

yofx 发表于 2008-3-14 22:59

谢谢楼上的解答。TC中答案是11
   现在关于这个问题几乎是每个人都有自己的说话。谢谢了。我会仔细看。。
  感觉这个问题确实属于鸡肋型的。。

forgives 发表于 2008-3-18 19:06

简单点说是这样的   2+4+5

zwzzwz 发表于 2008-3-19 04:42

我想是.
       m+=(j++)+(++j)+(++j)
       m+=2+4+5
       m=2+11
       m=13

yyj_dmx 发表于 2008-3-19 12:23

撒子哦?在TC2.0 运行出来是等于13,而在mytc 5.4.1 运行出来是等于14!!!!

编程小猪 发表于 2008-3-23 12:56

[quote]原帖由 [i]yyj_dmx[/i] 于 2008-3-19 12:23 发表 [url=http://bbs.hackerxfiles.net/redirect.php?goto=findpost&pid=735406&ptid=98541][img]http://bbs.hackerxfiles.net/images/common/back.gif[/img][/url]
撒子哦?在TC2.0 运行出来是等于13,而在mytc 5.4.1 运行出来是等于14!!!! [/quote]
很神奇是吧。
这种东西只有在课本和考试中才会出现,我考过一次计算机二级,并且过了,但我发现考试的题目大多都是这种类似于文字游戏的东西,完全没有实际意义,所以我暗暗发誓,再也不考什么计算机等级证了。我很佩服我们国家的计算机教育。

lq490910698 发表于 2008-3-26 16:46

lz问题很好嘛,我以前也遇到过,现在在运算符这块也不是反应的哪么快.:face17

ooixx 发表于 2008-3-26 20:18

#include <stdio.h>

void main(void)
{
        int m,j;
        m=j=2;
        m +=(j++)+(++j)+(++j) ;
        //    2     4     5
        //13
        printf("%d\n",m);//12
  
}

疯了....怎么会这样....

梦我心永恒 发表于 2008-3-29 14:32

m=2 j=2
m+=(j++)+(++j)+(++j)
这里是先算j=2,然后,加1,接下来算++j,就是在3之前加1,然后j为4,那就一共是7了!3+4+(现在J是4,那在加1就是5)!最后就是3+4+5,在现实中根本不会出现!郁闷!怎么现在考试就这样呢?艾!可悲~!

wyhbba007 发表于 2008-3-30 16:09

不同编译器的运算优先级不同。::11:: ::11::

alpha_xf 发表于 2008-4-1 20:09

无标准答案。
不同的编译器上运算结果大相径庭。
我在GCC上编译了一下,12。

ydzj 发表于 2008-4-4 12:52

顶七楼,这种东西完全没有必要这么些
这么写在不同的编辑器运行的结果会相差很远的

wzywsk 发表于 2008-4-5 09:00

14 14 14 14

是14 我试过了。。。。::02:: ::02:: ::02::

gxd722 发表于 2008-4-12 17:01

我在vc++6.0下跑出来是12,汗……
我的理解是,从右往左,所以j先自加变成3,再自加变成4,但是j++是先运算之后再自加,所以还是4,m=2+4+4+3=13,不知道怎么回事……

页: [1] 2


Powered by Discuz! 6.1.0  © 2001-2007 Comsenz Inc.