作者LPH66 (f0VMRgEBA)
看板CSSE
标题Re: [问题] 2题程式不懂,是要怎麽看呢?
时间Thu Jul 25 22:28:50 2013
※ 引述《irene6524 (Irene)》之铭言:
: 1.#include <stdio.h>
: #include <stdlib.h>
: int main(void)
: {
: int a=11,b=11;
: a+=a+=b+=b%=b<<2;
: printf(" %d ", a );
: system("pause");
: return 0;
: }
: 为甚麽答案是66? 是不是计算过程是
: a=a+a=a+b=b%b<<2 然後运算顺序% << + =(右到左)
: a=22=22=22=0 ,,a=0;
: 推 LPH66:第一题是哪里考的题目...烂透了 07/20 19:32
: → LPH66:这个式子是未定义行为 会得出什麽都有可能 07/20 19:33
: → LPH66:第二题我的答案跟你一样是 6 07/20 19:35
: 推 micklin:同楼上. 07/21 00:36
: → chienweichih:第二题把marco打开是 printf("%d\n",(6));喔 多了两 07/21 07:38
: → chienweichih:个刮号 07/21 07:38
: ※ 编辑: irene6524 来自: 180.206.152.8 (07/22 15:09)
: → irene6524:第一题补上定义了,第二题是答案错了吗? 07/22 15:13
: 推 m87145999:第一题应该是,b=b%44(这44是从b<<2),然後b+=b,a+=b,a+=a 07/23 20:21
: 推 LPH66:第一题不管怎麽补都是未定义行为 07/25 21:38
: 推 LPH66:唔, 我好像有弄错...来查一下标准 @@ 07/25 21:45
OK, 应该确定了一件事
这式子仍然是未定义行为
只不过正好我所知的两种行为得到的结果是一样的
问题在於这行程式在一个运算式之中对变数 a 跟 b 修改了两次以上
这会导致未定义行为
只不过这个式子里有所差别的地方计算出来的结果碰巧是一样的而已
(有所差别的例子可以看
#1Deo3lyi (C_and_CPP)
那里谈的是一个在许多地方都流传过的写法
但因为触发了未定义行为的关系 所以有时候产生的结果不如所想)
--
'Oh, Harry, don't you
see?' Hermione breathed. 'If she could have done
one thing to make
absolutely sure that every single person in this school
will read your interview, it was
banning it!'
---'Harry Potter and the order of the phoenix', P513
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.41.39.41
1F:推 irene6524:好专业,谢谢~ 08/01 17:26