打印

int a=5,b=0; b=(a++)+a; b=?

[复制链接]
2472|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tage|  楼主 | 2007-10-4 14:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看论坛里有几个答对的。

相关帖子

沙发
awey| | 2007-10-4 14:45 | 只看该作者

尽量避免这种不规范的用法

不同的编译器结果可能不一样。

使用特权

评论回复
板凳
tage|  楼主 | 2007-10-4 14:53 | 只看该作者

我也知道写的不规范

但,不同的编译器结果可能不一样,这句话怎么讲?

使用特权

评论回复
地板
computer00| | 2007-10-4 16:27 | 只看该作者

按照C标准,应该是10,但是不同的编译器,结果可能不一样

可能是10,也可能是11,也可能是12。所以还是不要写这么晕的语句比较好。

使用特权

评论回复
5
tage|  楼主 | 2007-10-4 23:27 | 只看该作者

新手刚学c,刚才试验了一下,果然

在keilc下结果是11,在TC下结果是10。看来我这个问题问的不怎么好。。。。

使用特权

评论回复
6
tubie| | 2007-10-5 00:57 | 只看该作者

我用CodeVision计算出是11.

使用特权

评论回复
7
zhanxiao| | 2007-10-5 11:54 | 只看该作者

是这样的,和编译器的关系很大的

使用特权

评论回复
8
dai_weis| | 2007-10-5 12:20 | 只看该作者

编译器不同结果可能不同,我测试是10

以下是GCC的编译的汇编结果,这样的代码是软件中隐藏祸端的开始。
108:          a = 5;
+0000012E:   E085        LDI     R24,0x05         Load immediate
+0000012F:   8389        STD     Y+1,R24          Store indirect with displacement
109:          b = 0;
+00000130:   821A        STD     Y+2,R1           Store indirect with displacement
110:          b = (a++) + a;
+00000131:   01FE        MOVW    R30,R28          Copy register pair
+00000132:   9631        ADIW    R30,0x01         Add immediate to word
+00000133:   8180        LDD     R24,Z+0          Load indirect with displacement
+00000134:   2F28        MOV     R18,R24          Copy register
+00000135:   8199        LDD     R25,Y+1          Load indirect with displacement
+00000136:   0F92        ADD     R25,R18          Add without carry
+00000137:   5F8F        SUBI    R24,0xFF         Subtract immediate
+00000138:   8380        STD     Z+0,R24          Store indirect with displacement
+00000139:   839A        STD     Y+2,R25 

使用特权

评论回复
9
平常人| | 2007-10-5 12:51 | 只看该作者

按照标准C结果好像应为11,结果不可能得到12

首先,标准C中表达式的解析是自左向右,所以先取a++的值,再与第二个操作数相加。

其次,标准C中a++完成后进行下个运算前a的值应立即更改,所以第二个操作数应解析出6。

最终结果就是5+6=11。


如果结果为10,则编译器要么同时解析两个操作数的值再做运算,要么对表达式的解析是自右向左;所以结果为10是不正确的。

使用特权

评论回复
10
tage|  楼主 | 2007-10-5 13:10 | 只看该作者

平常人

我用的是TC2.0 它是 ANSI C 吧, 结果是10。 0 warnning 0 error
但什么编译器能出来12?  我也疑问,还得00来说。

使用特权

评论回复
11
平常人| | 2007-10-5 13:35 | 只看该作者

结果不可能得到12,也许得到12的编译器有个大BUG

我在9楼已经讲清楚了什么情况会得到10。至于你用的编译器你还是去问原始厂商吧,商品的质量应有生产和销售的人负责。

使用特权

评论回复
12
computer00| | 2007-10-5 14:21 | 只看该作者

关于a++,到底是单指它一个,还是指整条表达式?

这个我也没弄明白。所以我也一直不敢放心使用。

就像这里这个(a++)+a,是指a+1在整条表达式之后,还是仅指a++这一项之后?

至于12,是我没细想,搞错了。如果再多搞几个,就更晕人了:(a++)+(a++)+a

使用特权

评论回复
13
awey| | 2007-10-5 14:32 | 只看该作者

这样写程序是没事找晕。。。

使用特权

评论回复
14
IceAge| | 2007-10-5 20:44 | 只看该作者

c++里写过 operator++ 的人应该能理解这个问题

(a++) + ... 里中 a 先复制一个 copy 参与运算,最后真正的 a +1。关键的问题是这个copy 的生存周期,理论上,应该是当前的使用周期,这意味着 compiler 必须要做很多额外的工作以确定使用周期结束。 c++里的 ++ 重载做不到这一点(毕竟不是 compiler,无法推测上下文), “懒“ compiler 一定是没有作这些额外的工作,所以会出现 11。 

b=(a++)+a;  等价于  b = a+ a; a++;

使用特权

评论回复
15
tage|  楼主 | 2007-10-6 01:01 | 只看该作者

IceAge

使用周期,说的好,

使用特权

评论回复
16
春天花会开| | 2007-10-6 11:04 | 只看该作者

标准的C应该是11.

a++是这个周期执行时a不变,到加a的时候a就加一了,所以为11.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

566

帖子

0

粉丝