为什么此代码运行?
#include <stdio.h>
int i();
int main(){
while(i){printf("Hi");}
}
while循环接受的i的确切值是什么?
我尝试了printf("%d", i)
,它说i
是未定义的,这是预期的,因为它只有声明,但是为什么while
起作用?
答案 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。