if 语句中的赋值语句如何充当条件?

How the assignment statement in an if statement serves as a condition?

if ((vnd = (struct diam_vnd_t *)g_hash_table_lookup(vendors,vend))) {...}

你能告诉我为什么括号里是赋值而不是布尔表达式吗?而在什么情况下这个赋值可以被认为是 "true" 或 "false" ?

C 将任何非零值视为 true,将任何 0 值视为假值。

此赋值的值等于它分配给 vnd 的值,在本例中为 struct diam_vnd_t *。 if 语句检查赋值后 vnd 是否为 NULL

这相当于:

vnd = (struct diam_vnd_t *)g_hash_table_lookup(vendors,vend);
if (vnd) {...}

"is equal to" 的逻辑运算符是 ==

当您说 vnd = (struct... 时,您将 = 之后的所有内容分配给变量 vnd。如果你想要真或假,你需要使用 ==

赋值总是用一个等号完成。 =

int i;
i = 0; //assignment

这会将 0 分配给一个名为 i 的整数。

您的 if 语句也会发生同样的事情。它是否在 if 语句中是无关紧要的。

(vnd = (struct diam_vnd_t *)g_hash_table_lookup(vendors,vend))

做一个布尔表达式,你需要使用==.

(vnd == (struct diam_vnd_t *)g_hash_table_lookup(vendors,vend))

这将 return 根据 2 项的比较判断真假

引用 C11,章节 §6.5.16,赋值运算符强调我的

An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment,111) but is not an lvalue.

因此,首先会发生赋值,然后,已赋值的值将用作if中的条件语句。

因此,如果

if (p = 0 )

将评估为 FALSE 并且

if (p = 5)

将为真。