为什么 sizeof 运算符不在 for 循环条件下求值?
Why is the sizeof operator not evaluated in a for loop condition?
我不知道为什么 sizeof
运算符在 运行 时没有在 for 循环条件中求值。我正在用不同的 C 编译器尝试这个简单的代码,但它总是不打印任何内容。但是,如果我将 sizeof(i)
替换为 4
那么它就可以正常工作:
for(int i = -2; i <= 4; i++)
#include <stdio.h>
int main()
{
for(int i = -2; i <= sizeof(i); i++)
printf("Hello World");
return 0;
}
问题是,sizeof()
运算符的结果是size_t
类型,这是一个无符号类型。
接下来,在比较中,i <= sizeof(i)
按照通常的算术转换规则,-2
是一个有符号的值,被提升为一个无符号的值,产生一个巨大的值,评估条件为假。所以不满足循环条件,不执行循环体
运行你的程序通过调试器查看每一步的值,当你在比较中看到提升的值时,你会更清楚。
sizeof
产生 unsigned
类型的值 (size_t
)。 i
被转换为该类型并且比较执行为
(size_t)-2 <= 4
类似于4000000000 < 4
您需要将 sizeof(i) 类型转换为 int。那应该可以解决问题。
所以只需将 for(int i = -2; i <= sizeof(i); i++)
替换为 for(int i = -2; i <= (int) sizeof(i); i++)
sizeof() returns size_t 这是一个无符号类型。
您可以尝试使用此代码:
#include<stdio.h>
int main()
{
int i=-2,j;
j=(int)sizeof(i);
for(i=-2;i<=j;i++)
printf("HELLO\n");
return 0;
}
您可以将 sizeof() 强制转换为 int。
我不知道为什么 sizeof
运算符在 运行 时没有在 for 循环条件中求值。我正在用不同的 C 编译器尝试这个简单的代码,但它总是不打印任何内容。但是,如果我将 sizeof(i)
替换为 4
那么它就可以正常工作:
for(int i = -2; i <= 4; i++)
#include <stdio.h>
int main()
{
for(int i = -2; i <= sizeof(i); i++)
printf("Hello World");
return 0;
}
问题是,sizeof()
运算符的结果是size_t
类型,这是一个无符号类型。
接下来,在比较中,i <= sizeof(i)
按照通常的算术转换规则,-2
是一个有符号的值,被提升为一个无符号的值,产生一个巨大的值,评估条件为假。所以不满足循环条件,不执行循环体
运行你的程序通过调试器查看每一步的值,当你在比较中看到提升的值时,你会更清楚。
sizeof
产生 unsigned
类型的值 (size_t
)。 i
被转换为该类型并且比较执行为
(size_t)-2 <= 4
类似于4000000000 < 4
您需要将 sizeof(i) 类型转换为 int。那应该可以解决问题。
所以只需将 for(int i = -2; i <= sizeof(i); i++)
替换为 for(int i = -2; i <= (int) sizeof(i); i++)
sizeof() returns size_t 这是一个无符号类型。 您可以尝试使用此代码:
#include<stdio.h>
int main()
{
int i=-2,j;
j=(int)sizeof(i);
for(i=-2;i<=j;i++)
printf("HELLO\n");
return 0;
}
您可以将 sizeof() 强制转换为 int。