语言功能是否允许编译器检查内存中变量的类型,或者是否仅根据用于变量类型的关键字进行类型检查?
例如:
unsigned short n = 3;
int *p = &n;
int和short都在内存中使用4个字节,但编译器不能隐式地从short *转换为int *。在这种情况下,编译器如何知道 n 不是 p 的有效地址?
答案 0 :(得分:3)
语言功能是否允许编译器检查内存中变量的类型,或者是否仅根据用于变量类型的关键字进行类型检查?
这是一个非常混乱的问题。编译器是实现该语言的东西。因此,语言功能可能要求编译器执行某些操作(以使该功能正常工作),但它不会允许编译器执行操作。
记忆中的A"变量"是一个运行时的概念。编译器仅涉及编译时:它将某种语言(源语言)的代码转换为另一种语言(目标语言,通常是汇编代码/机器代码)。它发出指令(执行时)保留内存并使用此内存来存储值。但是在运行时,当程序实际执行时,编译器不再是图片的一部分,因此无法检查任何内容。
在C中,在编译时检查类型。编译器知道文字的类型(例如42
是int
而"hello"
是char [6]
),它知道您声明的所有内容的类型(因为它必须解析声明),包括变量。类型检查和类型转换规则与类型的大小无关。
例如:
short int a = 42;
double b = a; // OK, even though commonly sizeof a == 2 and sizeof b == 8
另一方面:
signed char c;
char *p = &c; // error, even though commonly char and signed char have the same
// size, representation, and range of possible values
完全可以在不实际生成任何代码的情况下键入检查C.
答案 1 :(得分:0)
每个表达式都有一个类型,最终来自其中出现的变量和文字的类型。 &n
的类型为unsigned short*
,不能用于初始化int*
类型的变量。这与检查内存无关,因此无论变量类型如何,它都可以正常工作。