鱼C论坛

 找回密码
 立即注册
查看: 2490|回复: 11

C语言求助

[复制链接]
发表于 2014-6-14 20:05:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
设 x ,y为int型变量,则执行下列语句后,y的值是多少
x=5; y=x++*x++; y=--y*--y;
A 529 B2401 C2109 D625
我编辑运行后的结果是784 这是为什么啊?求助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-14 20:18:57 | 显示全部楼层
在同一个节点上多次对同一个变量进行自增或者自减是一种未定义行为。所以这结构是未明的,并且会根据不同编译器的优化得到不同的答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-14 20:25:30 | 显示全部楼层
529吧
y=x++*x++在编译器中先变成y=x*x;x++;
y=--y*--y变成--y;--y;y=y*y;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-14 20:27:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-14 21:17:51 | 显示全部楼层
这种表达式会产生副作用,不同的编译器可能会在不同的时机处理掉。

一般,前置与后置++是有区别的:
1、i++、i--:在表达式执行结束后,再进行++或--操作。
2、++i、--i:在表达式执行之前,先进行++或--操作。

x=5;
执行y = x++ * x++ 的步骤
1、y = x * x=5*5 =25;
2、x自加了2次, 在表达式结束后更新了,所以x=7

执行, y = --y * --y 的步骤:

1、"--"优先级高,执行2次,所以y=23
2、y = y * y =23*23
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-14 21:17:54 | 显示全部楼层
_Mouse 发表于 2014-6-14 20:27
我用VS2012算下来是这  楼上说的对

答案给的是529  能告诉我计算的过程吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-14 21:25:53 | 显示全部楼层
santaclaus 发表于 2014-6-14 21:17
这种表达式会产生副作用,不同的编译器可能会在不同的时机处理掉。

一般,前置与后置++是有区别的:

完全的弄懂了 十分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-14 22:31:39 | 显示全部楼层
请不要纠结逗号表达式 真正写代码时这没多少意义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-14 22:57:17 | 显示全部楼层
请问如果是
x=5;
y=x++*x++;
y=--y*--y*--y;呢?
执行的结果y是多少?此时还会是y=22*22*22呢?还是y=23*23*22呢?求解。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-14 23:04:49 | 显示全部楼层
受教受教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-15 00:20:23 | 显示全部楼层
本帖最后由 santaclaus 于 2014-6-15 14:17 编辑
verilog123 发表于 2014-6-14 22:57
请问如果是
x=5;
y=x++*x++;

y=25;
y=--y * --y * --y
这种表达式,是这样处理的
--y表示要立即更新y,当计算机扫描该表达式,发现有3个的--y,就立即更新y3次,即y减3,所以
y=22*22*22

再比如y=--y * ( y-- * --y )——既有y--也有--y的,怎么处理?
同样的道理,当发现--y时会立即更新y,y--会把y的更新延迟到表达式结束时。
因此计算机扫描该表达式,发现有两个--y,就立即y-2下来,
所y=23*(23--)*23=12167,里面的23--,表示先取23,最后在表达式结束时再y--,得y=12167-1=12166

结论:计算机完整扫描一遍表达式发现有几个--y,立即更新几次
         不管发现有几个的y--,都是在表达式结束的时候再执行几次y--
因此,我认为这两个等式在计算机看来,是等价y=--y * ( y-- * --y )    <==>y=--y * y-- * --y

本来这个问题我也迷茫,看汇编的代码后,发现好象是这样处理的。
但因试验的例子较少,不知结论是否正确。
当然,不同的编译器处理方式可能也不同!









想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-15 11:29:12 | 显示全部楼层
santaclaus 发表于 2014-6-15 00:20
y=25;
y=--y * --y * --y
这种表达式,是这样处理的

感谢楼主的经验分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 12:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表