为什么 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。