【发布时间】:2017-10-07 17:39:08
【问题描述】:
语言功能是否允许编译器检查内存中变量的类型,还是仅基于用于变量类型的关键字进行类型检查?
例如:
unsigned short n = 3;
int *p = &n;
int 和 short 都在内存中使用 4 个字节,但编译器无法将 short * 隐式转换为 int *。在这种情况下,编译器如何知道 n 不是 p 的有效地址?
【问题讨论】:
-
没有,也没有,也没有。
-
为什么编译器不能知道呢?它可以具有从变量名到范围类型的映射。
-
这是解析器的基本职责,是编译器解释语句和生成代码的部分。像 n 和 p 这样的变量出现在符号表中,它描述了它们的类型、大小和地址。处理赋值的解析器部分检查右手表达式类型是否匹配左手左值类型。不匹配的类型和缺少隐式转换使其生成错误消息。