有关运算符的问题

kernelhao 2003-11-11 07:55:56
int w,z,x,y;
x=5;y=4;
w=x++*w++*w++
z=--y*--y*--y
请问一下最后W,Z,X,Y的值为多少呢?
计算机到底是怎么运算上面的式子的呢?
...全文
40 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuangjingbo 2003-11-12
  • 打赏
  • 举报
回复
干吗这样写?
lotuszm 2003-11-12
  • 打赏
  • 举报
回复
有高手回答没有,我也看了这个问题真的很是奇怪,当z=--y*--y时仍然是4,说明此时应该是2×2 的结果,但为什么是三个时仍然是三,真的有些搞不明白,有没有高手回答啊
LinuxPanther 2003-11-12
  • 打赏
  • 举报
回复
w=125 x=8
z=4 y=1 VC6.0中
对于w=x++*x++*x++ 我是理解的。因为x是先用在加。所以为5*5*5 然后,在加加。
不过z=4,实在是不解 ,请高手指明。
kernelhao 2003-11-12
  • 打赏
  • 举报
回复
不好意思,写错了一个!w=x++*w++*w++应该为:w=x++*x++*x++

_goolooloo_ 2003-11-12
  • 打赏
  • 举报
回复
TianGuangZao(天光早) 说得很有道理,以前从来没有真正关心过这些问题,刚才仔细看了一下VC反汇编的代码,果然有些学问:

w=x++*x++*x++
这个表达式和大家说的一样,先取x值进行连乘,然后进行3次自加

z=--y*--y*--y
这个表达式就有点不同了,首先y自减两次,取y相乘,y再自减一次,再和上次相乘的结构相乘。因此,z=2*2*1=4。

想一想句法分析的原理,乘法是左结合的,生成的是二叉运算树,大概知道是怎么回事了
多写高人指点~
qufan 2003-11-12
  • 打赏
  • 举报
回复
路过 觉得怎么写代码的人是给自己找麻烦!!!
kdush 2003-11-12
  • 打赏
  • 举报
回复
感谢TianGuangZao(天光早) !你说的的确有道理,
但楼主,单纯的研究w,z的结果是毫无意义的。要知道这样的代码在编程中出现是无法容忍的,它的结果也会因为编辑器的不同而不同!
changshengjian 2003-11-12
  • 打赏
  • 举报
回复
z应该等于1啊
TianGuangZao 2003-11-12
  • 打赏
  • 举报
回复
首先在程序中写这样的代码是绝对应该避免,无可移植性,无可读性,容易出错,但讨论这样的代码绝对是有意义的,说别人有病的人都忘了自己是怎么过来的,当初又是如何苦苦思索的,你总不能因为你懂了,就可以剥夺别人求知的欲望。
首先老师喜欢出这类题目,决不是说明老师水平低,他不懂,故意刁难。
这类题目可以考察你对运算符优先级的理解:
w=x++*x++*x++
* 和 ++ 哪个优先呢?
表达式是按怎样的次序进行求值的,它是如何被分析的:
为什么取的是 x++ 而不是 x+ 呢?其中依据的是什么原理,如果以后你自己来写句法分析,你该如何实现呢?
让你知道不同的编译器对标准里未定义的行为,可能实现不同:
是先从表达式左边开始求值,还是该从表达式右边开始?
z=--y*--y*--y
是先把所有的 --y 求出来,再代入公式,如: z= 3*3*3
还是先求一个个求得再代入,如 z = 3*2*1
你会发现竟然有如此多的组合,也就明白了为什么给出明确答案是没有意义的。
促使你去深入的了解 ++y, y++ ,中间到底有哪些动作,是先取值,再加1,还是先加1,再取值等等。
我想学程序,总不能都循规蹈矩吧!只有平时多看些反面教材,适当钻一些”牛角尖“,你才会在以后的工作中知道哪些是你应该避免的。
UEAnswer 2003-11-11
  • 打赏
  • 举报
回复
箫剑说的也是,是不是写错了,优先级问题我也不清楚,但是的确w没有初值。
怎么做,等待大家的回答,我也不知道现在
edwardpro 2003-11-11
  • 打赏
  • 举报
回复
w=x++*w++*w++这句如果改成w=w++*w++*w++还有点价值,楼主这样就。。。不过某些老师可能喜欢这么考人。
tomsx 2003-11-11
  • 打赏
  • 举报
回复
油饼
xjsean 2003-11-11
  • 打赏
  • 举报
回复
就按你写的程序来计算吧,也有问题呀,你的w是int型变量,没有赋初值,而第三行的w=x++*w++*w++,这样的式子有意义吗???
sttony 2003-11-11
  • 打赏
  • 举报
回复
写这样的代码毫无意义,对于这种优先级容易发生混淆的地方,应该用()明确指明先后顺序,写的代码不仅给机器看还要给人看。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧