如何解决这段代码的“假”输出背后的原因是什么?
此 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");
}
,
而 size_t
是 unsigned 类型,而 -1
不是。
当 converting -1
与 size_t
类型相同时会导致问题(-1
变成一个非常大的数字,远大于 sizeof(int)
) .
由于 sizeof
返回一个无符号值(根据定义不能为负),像你这样的比较没有意义。此外,标准 C 不允许零大小的对象或类型,因此即使 sizof(any_type_or_expression) > 0
也将始终为真。
在表达式中混合有符号和无符号值时必须小心(并且 sizeof
产生一个 size_t
,它是无符号的)。
在相当多的情况下(包括这个),编译器会在对它们执行操作之前将两个值转换为相同的类型——当你混合有符号和无符号值时,相同的类型通常是无符号类型涉及。所以在这种情况下会发生什么是 -1
被转换为无符号 - 当转换为无符号值时,-1
总是转换为无符号类型可以容纳的最大值。
从那里开始,我猜剩下的可能相当清楚了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。