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

时间:2019-04-23 11:34:35

标签: c gcc

为什么此代码运行?

#include <stdio.h>
int i();
int main(){
    while(i){printf("Hi");}
}

while循环接受的i的确切值是什么?

我尝试了printf("%d", i),它说i是未定义的,这是预期的,因为它只有声明,但是为什么while起作用?

2 个答案:

答案 0 :(得分:8)

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

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

此处,i的值被用作函数的地址,即函数指针。

要添加更多背景信息,请访问gcc manual强调我的

  

-Waddress

     

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

答案 1 :(得分:0)

您具有函数声明int i();

C11标准(n1570)在6.3.2.1/4中声明:

  

函数指示符是具有函数类型的表达式。除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数,否则将转换类型为“函数返回类型”的函数指定符指向类型为“函数返回类型的指针”的表达式。

因此i中的while(i)是指向函数的指针,并且由于它是一个地址,因此它将始终为true。