复杂的C类型和布尔表达式解释
Complicated C type and Boolean expression explanation
使用 GDB 我有以下数据:
ptype phases
type = _Bool (*[6])(char *)
ptype phases[0]
type = _Bool (*)(char *)
首先,变量phases
的类型英文是什么?我是 GDB 和 C 的新手,所以我不确定这是 C 中的类型还是 GDB 中的某些显示约定。如果我执行以下操作:
p phases
= {0x400880 <phase0>, 0x4008c0 <phase1>, 0x400920 <phase2>, 0x400a10 <phase3>, 0x400ba0 <phase4>, 0x400c50 <phase5>}
数据在 GDB 中的呈现方式,phases
是布尔值、字符串对的数组吗?
第二个问题,我有下面这行逻辑我不明白(针对这个问题做了简化):
if(!((phases[0])("test"))) {
我不知道这个表达式是如何求值的。 phases[0]
给出一个 _Bool (*)(char *)
。然后我们有 "test"
字符指针,在它和 phases[0]
之间没有显式操作。这是如何评估的,这叫什么?
你这里有一个函数指针数组,其中每个函数接受一个 char *
参数和 returns 一个 _Bool
.
查看给定的表达式:
(!((phases[0])("test")))
phases[0]
是数组中的单个函数指针。它以 "test"
作为参数调用 ((phases[0])("test")
)。然后返回的 _Bool
值用逻辑 NOT 运算符取反 !
.
使用 GDB 我有以下数据:
ptype phases
type = _Bool (*[6])(char *)
ptype phases[0]
type = _Bool (*)(char *)
首先,变量phases
的类型英文是什么?我是 GDB 和 C 的新手,所以我不确定这是 C 中的类型还是 GDB 中的某些显示约定。如果我执行以下操作:
p phases
= {0x400880 <phase0>, 0x4008c0 <phase1>, 0x400920 <phase2>, 0x400a10 <phase3>, 0x400ba0 <phase4>, 0x400c50 <phase5>}
数据在 GDB 中的呈现方式,phases
是布尔值、字符串对的数组吗?
第二个问题,我有下面这行逻辑我不明白(针对这个问题做了简化):
if(!((phases[0])("test"))) {
我不知道这个表达式是如何求值的。 phases[0]
给出一个 _Bool (*)(char *)
。然后我们有 "test"
字符指针,在它和 phases[0]
之间没有显式操作。这是如何评估的,这叫什么?
你这里有一个函数指针数组,其中每个函数接受一个 char *
参数和 returns 一个 _Bool
.
查看给定的表达式:
(!((phases[0])("test")))
phases[0]
是数组中的单个函数指针。它以 "test"
作为参数调用 ((phases[0])("test")
)。然后返回的 _Bool
值用逻辑 NOT 运算符取反 !
.