- 论坛徽章:
- 11
|
本帖最后由 Ager 于 2012-10-20 00:34 编辑
L_kernel 发表于 2012-10-19 18:22 ![]()
在编译阶段之前,预处理就完了。
这个和预处理没有半毛钱的关系,倒是和a++*a++这种无聊的表达式有关系。 ...
顶一下LK大虾
我再补充一点儿……
对于楼主的这个结果,我只知道,在我用的GCC背景下,是这样的:- c = a++ * a++;
- 6: 8b 45 fc mov -0x4(%ebp),%eax
- 9: 0f af 45 fc imul -0x4(%ebp),%eax
- d: 89 45 f8 mov %eax,-0x8(%ebp)
- 10: 83 45 fc 01 addl $0x1,-0x4(%ebp)
- 14: 83 45 fc 01 addl $0x1,-0x4(%ebp)
- d = ++b * ++b;
- 18: 83 45 f4 01 addl $0x1,-0xc(%ebp)
- 1c: 83 45 f4 01 addl $0x1,-0xc(%ebp)
- 20: 8b 45 f4 mov -0xc(%ebp),%eax
- 23: 0f af 45 f4 imul -0xc(%ebp),%eax
- 27: 89 45 f0 mov %eax,-0x10(%ebp)
复制代码 我再强调一下:
(1)不能靠运行结果去猜测并且推定编译细节。要了解编译细节,就用编译器工具。看到的,只能说明关于被看到的东东的问题;看不到的,不要做任何推定,惟有保持沉默。
(2)(更加地!)不能靠运行结果去猜测并且推定C语言的法则(标准)。要了解法则,就阅读关于它们的文档。读到的,只能说明关于被读到的东东的问题;读不到的,不要做任何推定,惟有保持沉默。
(3)关于法则(标准)的文档,明确告诉我,形如楼主这样的式子,是属于“未定义的”。在我可以自由裁量的权利得以维护的情况下,我直接认为:这种式子,根本就是错的!必须杜绝。
以上,仅供参考,呵呵 ——:)
|
|