我正在阅读我的编程语言课程中的类型等价,我遇到过C中我不确定的情况。
它将C的“类型等价”描述为:
C使用类型等价的形式,它介于名称和结构等价之间,可以松散地描述为“结构和联合的名称等价,其他一切的结构等价。”
那么如果我有两个不同大小但相同基类型的数组:
typedef int A1[10];
typedef int A2[20];
由于我所需要的只是结构等价,这两者在结构上是否相同?在C中,索引的大小是数组类型的一部分还是没有?
答案 0 :(得分:3)
不,他们不是。
您可以尝试sizeof(A1)
和sizeof(A2)
,看看它们是不同的。
答案 1 :(得分:2)
不,他们不是同一类型。
在C中你不会收到错误,但在C ++中如果你尝试,你会收到类似的错误:
错误C2440:'初始化':无法从'int()[1024]'转换为'int()[512]'
以下是一些示例代码
int x[1024];
int y[512];
/*Create a pointer int[1024] type*/
int (*px)[1024] = &x;
/*Create a pointer int[512] type*/
int (*py)[512] = &y;
int (*py2)[512] = &x; /*<---compiling error in C++ but allowed in C even know it's wrong*/
即使知道C中允许最后一行,这两种类型也被认为是不同的。此外,数组与指向数组的指针不同,但正如您所看到的,类型声明是不同的。
答案 2 :(得分:0)
在源代码中,在某些上下文中,不同类型的变量在给定表达式中是兼容的,并且编译器将调用足够的魔法来执行正确/期望的事情,例如将数组作为参数传递给期望a的函数指针。 但是,这并不意味着那些内存布局是兼容的。看问题 Pointer vs array in C, non-trivial difference我错过了。
我不太确定你的书是什么意思“结构平等”,但想知道这是否可能是指默认的整数提升(但似乎也包括数组?)。但无论如何,整数提升是一个非常重要的问题,你应该花时间去理解。下面的printf应按照这些规则执行:
unsigned int i = 0;
if (i < -1) {
printf("This line is printed!\n");
}
C standard (ISO/IEC 9899:1990)包含一个标题为“通常的算术转换”的部分,用于定义行为。该标准不是免费提供的(相反,它的销售相当昂贵,因为ISO标准是每页定价...),但如果您搜索该术语,您应该能够找到一些有用的信息或报价。标准的一些草案是免费提供的,但是由于您不确切地知道最终标准的变化,因此会对那些存在大量不信任的人构成威胁。