下面的C代码有什么问题?
可能重复:下面的C代码有什么问题?,c,arrays,c-preprocessor,C,Arrays,C Preprocessor,可能重复: 以下C程序的预期输出是打印数组中的元素。但当实际运行时,它不会这样做 #include<stdio.h> #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) int array[] = {23,34,12,17,204,99,16}; int main() { int d; for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
以下C程序的预期输出是打印数组中的元素。但当实际运行时,它不会这样做
#include<stdio.h>
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};
int main()
{
int d;
for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
printf("%d\n",array[d+1]);
return 0;
}
#包括
#定义总元素(sizeof(数组)/sizeof(数组[0]))
int数组[]={23,34,12,17204,99,16};
int main()
{
int d;
对于(d=-1;d,因为sizeof
提供了一个无符号值,如果您将警告级别调高,您可能会注意到这个值,例如使用-Wall-Wextra
和gcc
(a):
如果您强制对其进行签名,则可以正常工作:
#define TOTAL_ELEMENTS (int)((sizeof(array) / sizeof(array[0])))
详细情况可以从ISO标准中收集。在不同类型之间的比较中,会进行升级以使类型兼容。选择的兼容类型取决于多个因素,如符号兼容性、精度和等级,但在这种情况下,无符号类型size\u t
被视为compatible类型,因此d
升级为该类型
不幸的是,将-1
强制转换为无符号类型(至少对于2的补码,这几乎可以肯定是您正在使用的补码)会导致相当大的正数
从(TOTAL_ELEMENTS-2)
中得到的5
肯定更大。换句话说,for语句实际上变成:
for (d = some big honking number way greater than five;
d <= 5;
d++
) {
// fat chance of getting in here !!
}
for(d=某些大于5的大喇叭号;
d因为sizeof
会给您一个无符号值,如果您将警告级别调高,您可能会注意到这个值,例如使用-Wall-Wextra
和gcc
(a):
如果您强制对其进行签名,则可以正常工作:
#define TOTAL_ELEMENTS (int)((sizeof(array) / sizeof(array[0])))
详细情况可以从ISO标准中收集。在不同类型之间的比较中,会进行升级以使类型兼容。选择的兼容类型取决于多个因素,如符号兼容性、精度和等级,但在这种情况下,无符号类型size\u t
被视为compatible类型,因此d
升级为该类型
不幸的是,将-1
强制转换为无符号类型(至少对于2的补码,这几乎可以肯定是您正在使用的补码)会导致相当大的正数
从(TOTAL_ELEMENTS-2)
中得到的5
肯定更大。换句话说,for语句实际上变成:
for (d = some big honking number way greater than five;
d <= 5;
d++
) {
// fat chance of getting in here !!
}
for(d=某些大于5的大喇叭号;
dTOTAL\u ELEMENTS
类型为size\u t
,减法2是在编译时完成的,因此是5UL
(强调无符号后缀)。与有符号整数d
的比较总是错误的。请尝试
for(d=-1;d <= (ssize_t)(TOTAL_ELEMENTS-2);d++)
对于(d=-1;dTOTAL_ELEMENTS
类型为size\t
,减法2是在编译时完成的,因此它是5UL
(强调无符号后缀)。与有符号整数d
的比较总是错误的。请尝试
for(d=-1;d <= (ssize_t)(TOTAL_ELEMENTS-2);d++)
for(d=-1;d澄清错误:sizeof()转换为size\u t
的结果类型,它只不过是一个无符号整数,大于或等于unsigned int
因此,(sizeof(array)/sizeof(array[0])的结果
是两个size\u t类型的操作数的结果。对这些操作数执行除法:size\u t/size\u t
。两个操作数的类型相同,因此工作正常。除法的结果是类型size\u t
,这是元素总数产生的类型
表达式(TOTAL_ELEMENTS-2)
因此具有类型size\u t-int
,因为整数文本2
是int类型
这里我们有两种不同的类型。然后发生的是所谓的平衡(正式称为“通常的算术转换”),当编译器发现两种不同的类型时会发生这种情况。平衡规则规定,如果一个操作数是有符号的,另一个是无符号的,那么有符号的操作数会无声地隐式转换为无符号类型
这就是这段代码中发生的情况。size\u t-int
被转换为size\u t-size\u t
,然后执行减法,结果是size\u t
。然后int来澄清错误:sizeof()转换为size\u t
的结果类型,它只不过是一个无符号整数,大于或等于unsigned int
因此,(sizeof(array)/sizeof(array[0])的结果
是两个size\u t类型的操作数的结果。对这些操作数执行除法:size\u t/size\u t
。两个操作数的类型相同,因此工作正常。除法的结果是类型size\u t
,这是元素总数产生的类型
表达式(TOTAL_ELEMENTS-2)
因此具有类型size\u t-int
,因为整数文本2
是int类型
这里我们有两种不同的类型。然后发生的是所谓的平衡(正式称为“通常的算术转换”),当编译器发现两种不同的类型时会发生这种情况。平衡规则规定,如果一个操作数是有符号的,另一个是无符号的,那么有符号的操作数会无声地隐式转换为无符号类型
这就是在这段代码中发生的情况。size\u t-int
被转换成size\u t-size\u t
,然后执行减法,结果是size\u t
。然后int您是如何尝试调试的?例如,您是否尝试打印了总元素的值?您是如何尝试调试的?例如,您是否尝试过intf TOTAL_ELEMENTS的值?我对programmin语言不太熟悉。所以我不知道这段代码有什么问题。你能建议更正吗…@Parag,我给了你更正,这是对expressio大小的转换