编译器允许"char * k = false"?为什么?
compiler allows 'char * k= false'? Why?
我从我的视角编译器行为中发现了奇怪的,它允许将布尔值分配给 * 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
是一个布尔文字,因此它属于恒定表达式的类别,因此可以作为空指针常数。
false
和 true
是0
和1
的快捷方式。对于指针,您使用NULL
哪个define NULL 0
。因此,它纠正了语法。
编译器允许它,因为在C false
中与0
和NULL
相同。
就个人而言,至少对于作业,我发现使用NULL
表示空指针更容易理解,并且更正确。
btw,在C 之前,在某些系统上NULL
实际上是定义为(void*)0xffff
的宏;可以在此答案中找到一些背景。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- 为什么将三个变量与 == 一起比较会计算为 false?
- 为什么我总是在代码中得到"false"
- 为什么 GetExitCodeThread() 在这里返回 FALSE?
- C++如果使用 lambda 表达式的语句返回 true,但输出来自 false,为什么
- 为什么 std::isnan() 对于具有 NAN 值的双变量返回 false
- 为什么在 c++ 中使用 ios::sync_with_stdio(false) 后在 cout 之前执行 printf
- 为什么 if 语句对于运算符重载函数计算 false
- 为什么pyarg_parsetuple总是返回false
- 为什么如果条件为false,为什么仍会对语句进行辩护
- 为什么enumProcessModules返回false值和299代码错误
- 为什么 'std::is_constructible_v<int[2], int, int> == false'
- 为什么计时器工作了这么多次,甚至我设置它的repeat=false
- 为什么在 sync_with_stdio(false) 之前使用 cin 为下一个 i/p 变量提供随机值
- 为什么没有int或false的数据类型
- 为什么std :: iS_array返回false for sTD ::数组
- 当参数相等时,为什么必须std :: sort比较函数返回false
- 两个为 true 的变量在 (tmp1 == tmp2) 中返回 false.为什么