下面的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的大喇叭号;

d
TOTAL\u ELEMENTS
类型为
size\u t
,减法2是在编译时完成的,因此是
5UL
(强调无符号后缀)。与有符号整数
d
的比较总是错误的。请尝试

for(d=-1;d <= (ssize_t)(TOTAL_ELEMENTS-2);d++)

对于(d=-1;d
TOTAL_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大小的转换