淡定一点 发表于 2014-6-14 20:05:17

C语言求助

设 x ,y为int型变量,则执行下列语句后,y的值是多少
x=5; y=x++*x++; y=--y*--y;
A 529 B2401 C2109 D625
我编辑运行后的结果是784 这是为什么啊?求助

QQ[我在线上] 发表于 2014-6-14 20:18:57

在同一个节点上多次对同一个变量进行自增或者自减是一种未定义行为。所以这结构是未明的,并且会根据不同编译器的优化得到不同的答案

_Mouse 发表于 2014-6-14 20:25:30

529吧
y=x++*x++在编译器中先变成y=x*x;x++;
y=--y*--y变成--y;--y;y=y*y;

_Mouse 发表于 2014-6-14 20:27:23

_Mouse 发表于 2014-6-14 20:25 static/image/common/back.gif
529吧
y=x++*x++在编译器中先变成y=x*x;x++;
y=--y*--y变成--y;--y;y=y*y;

我用VS2012算下来是这楼上说的对

santaclaus 发表于 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

淡定一点 发表于 2014-6-14 21:17:54

_Mouse 发表于 2014-6-14 20:27 static/image/common/back.gif
我用VS2012算下来是这楼上说的对

答案给的是529能告诉我计算的过程吗

淡定一点 发表于 2014-6-14 21:25:53

santaclaus 发表于 2014-6-14 21:17 static/image/common/back.gif
这种表达式会产生副作用,不同的编译器可能会在不同的时机处理掉。

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


完全的弄懂了 十分感谢

牡丹花下死做鬼 发表于 2014-6-14 22:31:39

请不要纠结逗号表达式 真正写代码时这没多少意义

verilog123 发表于 2014-6-14 22:57:17

请问如果是
x=5;
y=x++*x++;
y=--y*--y*--y;呢?
执行的结果y是多少?此时还会是y=22*22*22呢?还是y=23*23*22呢?求解。。。。。。

/shd 发表于 2014-6-14 23:04:49

受教受教{:5_109:}

santaclaus 发表于 2014-6-15 00:20:23

本帖最后由 santaclaus 于 2014-6-15 14:17 编辑

verilog123 发表于 2014-6-14 22:57 static/image/common/back.gif
请问如果是
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

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









淡定一点 发表于 2014-6-15 11:29:12

santaclaus 发表于 2014-6-15 00:20 static/image/common/back.gif
y=25;
y=--y * --y * --y
这种表达式,是这样处理的


感谢楼主的经验分享
页: [1]
查看完整版本: C语言求助