这段代码的“假”输出背后的原因是什么?

问题描述

此 C 代码给出输出“False”并且 heroku pg:copy [source-app]::SOURCE DESTINATION --app [destination-app] 块正在执行。

else 的值为 4,但 sizeof(int) 的值为 0。

我不明白发生了什么。

sizeof(int) > -1

解决方法

您的 sizeof(int) > -1 测试正在比较两个无符号整数。这是因为 sizeof 运算符返回 size_t 类型的 unsigned 值,因此 -1 值被转换为其“等效”表示形式为无符号值,这实际上是 unsigned int最大可能值。

要解决此问题,您需要显式sizeof 值强制转换为(有符号的)int

    if ((int)sizeof(int) > -1) {
        printf("True");
    }
,

sizeof 运算符给出 size_t 结果。

size_tunsigned 类型,而 -1 不是。

converting -1size_t 类型相同时会导致问题(-1 变成一个非常大的数字,远大于 sizeof(int)) .

由于 sizeof 返回一个无符号值(根据定义不能为负),像你这样的比较没有意义。此外,标准 C 不允许零大小的对象或类型,因此即使 sizof(any_type_or_expression) > 0 也将始终为真。

,

在表达式中混合有符号和无符号值时必须小心(并且 sizeof 产生一个 size_t,它是无符号的)。

在相当多的情况下(包括这个),编译器会在对它们执行操作之前将两个值转换为相同的类型——当你混合有符号和无符号值时,相同的类型通常是无符号类型涉及。所以在这种情况下会发生什么是 -1 被转换为无符号 - 当转换为无符号值时,-1 总是转换为无符号类型可以容纳的最大值。

从那里开始,我猜剩下的可能相当清楚了。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...