【问题标题】:Variable is correct, but test case does not execute变量正确,但测试用例不执行
【发布时间】:2021-11-10 02:40:22
【问题描述】:

我写了以下代码:

#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");
        }
}

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

【问题讨论】:

  • 试试long long test = -1;

标签: c if-statement testcase


【解决方案1】:

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

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

【讨论】:

  • 严格来说,sizeof 返回一个 size_t 类型的值,这是一个无符号类型,但通常不是 unsigned(如 unsigned int)。但是是的,-1 的值被转换为size_t,而-1 在二进制补码系统中的转换值是size_t 可表示的最大值。
  • 出于这个和其他原因,我学会了始终使用-Wall -Wextra -Werror 进行编译以显示所有警告并将它们转换为错误以强制我修复它们。 I wrote about this and recommend it in my repo here.
  • " 定义的变量 TOTAL_ELEMENTS 的类型是 unsigned int" --> C 没有指定。 size_t 是一些 unsinged 类型。可以是unsignedunsigned long 或其他。
猜你喜欢
  • 2018-12-07
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
相关资源
最近更新 更多