楼主:
ssac (吼..)
2016-07-12 19:46:40不好意思因为是不同小题 就分开贴了 不是为了赚P币~XD
题目 int main(){
int a=1,b=2,c=3,d=4;
prinf("%d %d %d %d ", a+b+c+d , (b*=a) , (a+=d),(d++));
}
补习班的答案
10 2 5 4
使用gcc的结果
26 12 6 4
这部份也是觉得推算起来很鬼异~
毕竟d++的生效要是下一行 才有反应~?
这只是compiler的不同吗?
作者:
QoiiwWe (G)
2016-07-12 19:57:00不知道编译器遇到这样的写法是怎么编译
哀 再写的时候就想说怎么可能这么简单 但还是错了我跑出来的结果也跟你一样
我完全不知道会由后往前耶 长知职了(可惜是考完后)是compiler的关系吗?
作者: fatty3321 2016-07-12 20:14:00
直觉会是前往后吧…反倒觉得老师不会真的去用编译器跑,太多版本了
应该是考系统传入副程式参数处理的顺序 细到只会在考卷上看到的用法在公司用这种写法还不被后面的人抓出来摔...
楼主:
ssac (吼..)
2016-07-12 20:48:00嗯 真的是为了考试为难学生吧~其实当天我在心里念了很久
作者:
QoiiwWe (G)
2016-07-12 20:52:00我朋友说这张是计概等级的题目...平均要创新高
如果有人写出compiler的答案 我输也能输得心服口服
楼主:
ssac (吼..)
2016-07-12 20:58:00QoiiwWe 那可以请你朋友帮忙解说一下此题吗?真的很想知道拜托
看讨论也是说没定义 顺序留给各个编译器优化决定所以左推算 右推算 跳着推算都可以...考Side effect真的很有种 实作都会避免这种写法
Orz…因为想说b*=a代表b=b*a,是一个算式,所以我写结果非0即为true,输出写1…哭
作者: fatty3321 2016-07-12 21:30:00
我本来感觉这题的本意是要给考生拉分的,应该没有这么凶残吧…(还从后面来…)
我刚刚自己测试了一下答案是 22 10 5 4 考试的时候就觉得毛毛的 想说怎么可能是10 2 5 4这么简单 果然有陷阱 a101大那个想法我也有想过 在if判断里面指定算式非0的话就为true 想写1 但最后反正22 10那种推法我完全没考虑到 所以也没有惋惜的遗憾 肯定被扣10分心里面没疙瘩了
作者:
angerD (丹佐)
2016-07-12 23:29:00其实最早的K&R C有定义这种operation
作者:
iPhone007 (iPhone007)
2016-07-12 23:50:00作者:
kisha024 (4545454554)
2016-07-13 00:32:00为什么上一篇发问被删掉了?
补习班对 大一这种题目早就被老师出到烂掉了c的程式执行会从后面开始 就跟网络处理封包会从后面CRC开始检查起一样 要特别注意的点不是compiler的特性 是c语言处理的方式是这样
考完回再研究了一下 是跟calling conventions有关C默认使用cdecl 里面定义参数有右至左传入所以不是C语言就这样 要看使用哪种calling conventions但前面都说了cdecl就是C的使用标准 其他都应该为特例所以答案还是以右到左为主吧..
作者: Snack (多多) 2016-07-13 21:30:00
我觉得 答案搞不好是 10 2 5 5...
作者:
max60716 (Brady)
2016-07-14 16:22:00这种题目在普考很常见,有做普考考古题的,应该就知道这是从左到右喔,而且是考选不公布的解答 所以解答是:10 2 5 4 不用想太多囉 但实务上 不会有人这样写程式本身写程式不会这样用 还是有高手 常这样用... 佩服所以重点还是在考古题囉 先推我有上榜吧@@