提问人:SWIIWII 提问时间:5/11/2016 最后编辑:Sourav GhoshSWIIWII 更新时间:5/12/2016 访问量:1662
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))) {...}
你能告诉我为什么它是一个赋值而不是括号中的布尔表达式吗?在什么情况下,这个任务可以被认为是“真的”或“假的”?
答:
0赞
Alexander
5/11/2016
#1
C 认为任何非零的东西都是 ,任何 0 都是假的。true
此赋值的值等于它赋值的值,在本例中为 a 。if 语句检查是否在赋值之后。vnd
struct diam_vnd_t *
vnd
NULL
这相当于:
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
类型只是一个 .从根本上说,该语言将“零”和“非零”作为布尔值而不是/原子处理。bool
unsigned int
true
false
0赞
too honest for this site
5/11/2016
否,是具有值的不同无符号整数类型,并且是映射到 的宏。它不是.注意:这是标准的 C,不是一些自制的!关于“真”/“假”解释:尝试或。请注意,布尔逻辑没有定义“true”/“false”必须如何表示。它们通常由 / 表示,因为这样可以简化数学运算。请参阅维基百科。_Bool
0
1
bool
stdbool.h
_Bool
unsigned int
typedef
_Bool b = 4;
printf("%d", (bool)5);
0
1
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; //declaration
i = 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
谢谢,这正是我需要的,我会接受的。
上一个:If 子句使用赋值运算符的行为与使用相等运算符的行为相同
下一个:如果语句始终执行
评论
((..))