if 语句中的赋值语句如何作为条件?

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

提问人:SWIIWII 提问时间:5/11/2016 最后编辑:Sourav GhoshSWIIWII 更新时间:5/12/2016 访问量:1662

问:

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

你能告诉我为什么它是一个赋值而不是括号中的布尔表达式吗?在什么情况下,这个任务可以被认为是“真的”或“假的”?

c if-statement 布尔 赋值运算符

评论

2赞 too honest for this site 5/11/2016
任何中途的现代编译器都会有充分的理由警告这一点
0赞 Sourav Ghosh 5/11/2016
@Olaf 即使使用后?((..))
0赞 too honest for this site 5/11/2016
@SouravGhosh:嗯,我真的没有注意到他们。好的,我改成“应该”。通过 gcc 验证:它甚至建议使用括号来避免警告(并且它们有效)。哎呀,这应该需要明确的比较来抑制警告,没有什么比这更明显的了。谢谢你通知我。
0赞 Sourav Ghosh 5/12/2016
标记的重复项不是重复项,因为链接的问题回答了有关用法的问题,而此问题询问的是行为。我正在重新打开它。:)

答:

0赞 Alexander 5/11/2016 #1

C 认为任何非零的东西都是 ,任何 0 都是假的。true

此赋值的值等于它赋值的值,在本例中为 a 。if 语句检查是否在赋值之后。vndstruct diam_vnd_t *vndNULL

这相当于:

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

评论

0赞 too honest for this site 5/11/2016
C 很好地具有布尔类型。在条件中,任何表达式都会转换为布尔结果(不过是 类型)。int
0赞 Alexander 5/11/2016
类型只是一个 .从根本上说,该语言将“零”和“非零”作为布尔值而不是/原子处理。boolunsigned inttruefalse
0赞 too honest for this site 5/11/2016
否,是具有值的不同无符号整数类型,并且是映射到 的宏。它不是.注意:这是标准的 C,不是一些自制的!关于“真”/“假”解释:尝试或。请注意,布尔逻辑没有定义“true”/“false”必须如何表示。它们通常由 / 表示,因为这样可以简化数学运算。请参阅维基百科。_Bool01boolstdbool.h_Boolunsigned inttypedef_Bool b = 4;printf("%d", (bool)5);01
0赞 too honest for this site 5/12/2016
最好直接阅读 C 标准(特别是 6.2.5p2 和 p6 等),而不是第二/第三来源。Maybne 您会发现自过去 17 年以来的其他一些新功能。您可能还会发现这是一个具有空指针常量的宏,而不是特定值。指针变量只能是 null 指针。而这并不需要具有全零的二进制表示。尽管如此,这样的空指针必须计算“false”。NULL
0赞 CaldwellYSR 5/11/2016 #2

“is equal to” 的逻辑运算符是==

当你说你把后面的所有东西都分配给变量时。如果你想要一个 true 或 false,你需要使用vnd = (struct...=vnd==

0赞 element11 5/11/2016 #3

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

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))

这将根据 2 个项目的比较返回 true 或 false

评论

0赞 too honest for this site 5/11/2016
int i = 0;不是作业。
0赞 element11 5/12/2016
@Olaf,<——像那样?int i; //declarationi = 0; //assignment
0赞 too honest for this site 5/12/2016
这些是不同的东西!
0赞 element11 5/12/2016
@Olaf 是的,我知道这一点,我只是想确认这就是你所指的。我想我应该把两者分开。
4赞 Sourav Ghosh 5/11/2016 #4

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

赋值运算符将值存储在左操作数指定的对象中。一 赋值表达式在赋值后具有左操作数的值,111) 但不是 一个左值。

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

所以,如果

if (p = 0 )

将计算结果为 FALSE 和

if (p = 5)

将是真的。

评论

2赞 SWIIWII 5/11/2016
谢谢,这正是我需要的,我会接受的。