此代码的 "False" 输出背后的原因是什么?
What is the reason behind the "False" output of this code?
此 C 代码给出输出“False”并且正在执行 else
块。
sizeof(int)
的值为4,sizeof(int) > -1
的值为0。
我不明白发生了什么。
#include <stdio.h>
void main()
{
if (sizeof(int) > -1 )
{
printf("True");
}
else
{
printf("False");
}
printf("\n%d", (sizeof(int)) ); //output: 4
printf("\n%d", (sizeof(int) > -1) ); //output: 0
}
sizeof
operator gives a size_t
结果。
并且 size_t
是 unsigned 类型,而 -1
不是。
当 converting -1
与 size_t
相同类型时会导致问题(-1
变成一个非常大的数字,比 sizeof(int)
).
因为 sizeof
returns 一个无符号值(根据定义不能为负),像你这样的比较没有意义。此外,标准 C 不允许零大小的对象或类型,因此即使 sizof(any_type_or_expression) > 0
也将始终为真。
您的 sizeof(int) > -1
测试正在比较两个 无符号 整数。这是因为 sizeof
运算符 returns 一个 size_t
值,它是 unsigned
类型,所以 -1
值被转换为它的 'equivalent'表示为无符号值,这实际上是 最大可能的 值 unsigned int
.
要解决此问题,您需要显式 将 sizeof
值转换为(有符号)int
:
if ((int)sizeof(int) > -1) {
printf("True");
}
在表达式中混合有符号和无符号值时必须小心(sizeof
产生 size_t
,它是无符号的)。
在相当多的情况下(包括这个),编译器会在对它们执行操作之前将两个值转换为相同的类型——当您混合使用有符号和无符号值时,相同的类型通常是涉及无符号类型。所以在这种情况下发生的是 -1
被转换为无符号 - 当转换为无符号值时,-1
总是转换为无符号类型可以容纳的最大值。
从那里开始,剩下的可能很清楚了,我想。
此 C 代码给出输出“False”并且正在执行 else
块。
sizeof(int)
的值为4,sizeof(int) > -1
的值为0。
我不明白发生了什么。
#include <stdio.h>
void main()
{
if (sizeof(int) > -1 )
{
printf("True");
}
else
{
printf("False");
}
printf("\n%d", (sizeof(int)) ); //output: 4
printf("\n%d", (sizeof(int) > -1) ); //output: 0
}
sizeof
operator gives a size_t
结果。
并且 size_t
是 unsigned 类型,而 -1
不是。
当 converting -1
与 size_t
相同类型时会导致问题(-1
变成一个非常大的数字,比 sizeof(int)
).
因为 sizeof
returns 一个无符号值(根据定义不能为负),像你这样的比较没有意义。此外,标准 C 不允许零大小的对象或类型,因此即使 sizof(any_type_or_expression) > 0
也将始终为真。
您的 sizeof(int) > -1
测试正在比较两个 无符号 整数。这是因为 sizeof
运算符 returns 一个 size_t
值,它是 unsigned
类型,所以 -1
值被转换为它的 'equivalent'表示为无符号值,这实际上是 最大可能的 值 unsigned int
.
要解决此问题,您需要显式 将 sizeof
值转换为(有符号)int
:
if ((int)sizeof(int) > -1) {
printf("True");
}
在表达式中混合有符号和无符号值时必须小心(sizeof
产生 size_t
,它是无符号的)。
在相当多的情况下(包括这个),编译器会在对它们执行操作之前将两个值转换为相同的类型——当您混合使用有符号和无符号值时,相同的类型通常是涉及无符号类型。所以在这种情况下发生的是 -1
被转换为无符号 - 当转换为无符号值时,-1
总是转换为无符号类型可以容纳的最大值。
从那里开始,剩下的可能很清楚了,我想。