编译器允许"char * k = false"?为什么?

compiler allows 'char * k= false'? Why?

本文关键字:false 为什么 char 编译器      更新时间:2023-10-16

我从我的视角编译器行为中发现了奇怪的,它允许将布尔值分配给 * char

char * k= false;

为什么?但是分配后 * char仍未初始化。为什么编译器不允许分配int值?

它将隐式将布尔值 false转换为具有值零的整数,并声明为空指针。实际上与

没有什么不同
char* k = 0;

有效语法

c 03标准,#4.10:

无效指针常数是整体常数表达式(5.19) 整数类型的rvalue评估为零。

5.19:

积分常数表达只能涉及文字(2.13), 积分或 以恒定表达式(8.5), 积分或枚举类型的非类型温度参数,以及 sizeof表达式。

false是一个布尔文字,因此它属于恒定表达式的类别,因此可以作为空指针常数。

falsetrue01的快捷方式。对于指针,您使用NULL哪个define NULL 0。因此,它纠正了语法。

编译器允许它,因为在C false中与0NULL相同。

就个人而言,至少对于作业,我发现使用NULL表示空指针更容易理解,并且更正确。

btw,在C 之前,在某些系统上NULL实际上是定义为(void*)0xffff的宏;可以在此答案中找到一些背景。