变量正确,但测试用例不执行

ADB*_*dge 1 c if-statement testcase

我写了以下代码:

#include <stdio.h>

int array[] = {23, 43, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))

int main()
{
        int test = -1;

        if (test <= TOTAL_ELEMENTS)
        {
                printf("Hello, got here!\n");
        }
}
Run Code Online (Sandbox Code Playgroud)

当我编译此代码(带有gcc main.c -Wall(无警告!))并运行它时,printf无法执行。我的意思是,test= -1,它肯定小于数组的大小(7 位数字)。错误在哪里?

ADB*_*dge 6

该错误在于unsigned和之间的差异signed。具体来说,定义的变量TOTAL_ELEMENTS的类型是unsigned intsizeof返回unsigned,因为大小永远不能为负)。该测试正在将 asigned int与 an进行比较unsigned int。那失败了,因为test被提升为unsigned. -1 转为无符号变成一个大的正整数,从而使if条件返回 false。

如果你用gcc main.c -Wall -Wextra它编译会发出警告。

  • 严格来说,“sizeof”返回一个“size_t”类型的值,这是一个无符号类型,但通常不是“unsigned”(如“unsigned int”)。但是,是的,值“-1”被转换为“size_t”,并且在补码系统中“-1”的转换值是“size_t”可表示的最大值。 (7认同)