关于C语言条件表达式简写的技术问询:!与指针的作用及真值判定
关于链表空判断函数的逻辑详解
好问题!咱们一步步拆解这个is_empty函数里的逻辑,把你关心的两个点讲明白:
1. !符号如何作用于空指针?
在C语言里,空指针(NULL)本质上等价于整数0(标准定义是(void*)0)。而C的逻辑运算遵循一个简单规则:
- 任何非零值都会被当作“真”
- 只有0会被当作“假”
!是逻辑非运算符,它的作用是先把操作数转换成布尔值(真/假),再取反:
- 当
head是空指针时,head的值为0(假),!head就等于!0,结果是1(真) - 当
head是非空指针时,head的值是某个非零的内存地址(真),!head就等于!非0,结果是0(假)
你的函数里用了三元表达式!head ? 1:0,其实这里的三元运算有点“多此一举”——因为!head本身已经返回1或0了,直接return !head;就能达到同样效果,不过既然你能理解简写形式,这个点就当额外补充啦。
2. 条件判断里的“真”是仅指1吗?
当然不是!C语言里的条件判断对“真”的定义非常宽泛:所有非零值(不管是1、2、0x1234还是其他任何非零整数/指针)都会被视为“真”,只有0(包括空指针NULL)才是“假”。
举个例子:
- 如果
head指向地址0x4000(非空),那么if(head)会判定为真,!head就是0,函数返回0 - 如果
head是NULL(0),if(head)判定为假,!head就是1,函数返回1
所以不管非空指针的具体值是什么,只要不是NULL,都会被条件判断视为“真”,进而让!head变成0,函数返回0。
内容的提问来源于stack exchange,提问作者Hocine Abdellatif Houari
相关产品推荐
相关产品推荐

