While循环以未定义函数的名称作为条件运行

Div*_*h_C 4 c gcc

为什么运行此代码?

#include <stdio.h>
int i();
int main(){
    while(i){printf("Hi");}
}
Run Code Online (Sandbox Code Playgroud)

while循环接受的i的值到底是多少?

我尝试过,printf("%d", i)并说它i是未定义的,因为它只有一个声明,这是期望的,但是为什么while行得通呢?

Sou*_*osh 8

如果您在启用适当警告的情况下进行编译,则会看到

warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]
     while(i){printf("Hi\n");}
Run Code Online (Sandbox Code Playgroud)

在此,的值i作为函数的地址,即函数指针。

要添加更多内容,请参阅gcc手册重点是我的

-Waddress

警告有关内存地址的可疑使用。其中包括在条件表达式中使用函数的地址,例如void func(void); if (func)以及与字符串文字的内存地址进行比较(例如)if (x == "abc")这样的用法通常表示程序员错误:函数的地址总是评估为true,因此在有条件的条件下使用它们通常表明程序员忘记了函数调用中的括号;以及与字符串文字的比较会导致未指定的行为,并且不能在C语言中移植,因此它们通常表明程序员打算使用strcmp。该警告由启用-Wall