|
超神级 发表于 2013-10-11 17:22
额...........
首先,编译器是会犯错的。
C语言是由ISO C标准来定义的,不是由哪家编译器定义的。
所以C存在一种绝对权威,就是ISO C的文本,只要讨论的对象是通行的C语言(而不是哪家的C“方言”),你可以很自信的说,凡是符合ISO C标准的才是正确的,无论哪家的编译器给出了什么结果,只要和ISO C标准相悖,那就是编译器错了。
然后,不应该用汇编解释C语言。
ISO C语言是一种定义在抽象计算机(abstract machine)上的语言,编译器做的事情其实就是把这种抽象计算机的行为投射到某种特殊的计算机上去。所以说,指针变量里装的是内存地址,对吗?只在当前常用的计算机架构下是正确的,对于某些不常见的计算机,或者将来的计算机来说,则是未必正确的。
另外,用汇编来解释C也不大实用,如果你手边不放一份ISO C的文本……ISO C含有大量的未定义行为,例如你这么写
int i = 0;
i = i++;
主流编译器都会告诉你一个结果,但是这并不代表这一段是“正确”的C程序——编译器没有义务告诉你这段代码中包含未定义行为。
所以,依靠汇编代码来解释C,很多时候会把错误的当成正确的,并且还自以为“从深层次彻底掌握了”某个知识点,却不知只是编译器因为这样做方便随便告诉你个结果而已——这是程序员的责任,不是编译器的。 |
|