我有以下代码,当我尝试使用 sizeof list a 作为 for 循环中的条件时,它不会进入它,但如果我对其进行硬编码,它就会进入循环。为什么会发生这种行为?
#include <limits.h>
#include <malloc.h>
#include <stdio.h>
#define MY_VAL (sizeof(a) / sizeof(a[0]))
#define MY_NEW_VAL 5
int a[] = {1, 2, 3, 4, 5, 6, 7};
int main() {
int i;
for (i = -1; i <= (MY_VAL - 2); i++) {
printf("In loop 1\n");
}
for (i = -1; i <= MY_NEW_VAL; i++) {
printf("In loop 2\n");
}
}
Run Code Online (Sandbox Code Playgroud)
输出-->
In loop 2
In loop 2
In loop 2
In loop 2
In loop 2
In loop 2
In loop 2
Run Code Online (Sandbox Code Playgroud)
我的编译器是 clang 版本 15.0.7,运行 linux 作为我的操作系统。以防万一这是编译器特定的行为。
我知道这不是在现实世界用例中使用的东西,只是发现这种行为很奇怪。请解释。
sizeof是类型size_t,它是无符号的,而 youri是有符号的。C 正在转换i为 a size_t,这使得 -1 成为一个大于 的大正数 \xe2\x80\x94 MY_VAL - 2。所以循环永远不会运行。如果您启用了足够的警告,编译器会告诉您这个可能的问题。
MY_NEW_VAL另一方面是从常量值派生的类型。对于这个特定的小值,它是一个int. 这样就可以了。
由于您想从 -1 开始,因此需要对限制进行签名:for (i = -1; i <= (int)MY_VAL - 2; i++)。然后就可以了。