gpt4 book ai didi

c - bool 变量如何不等于 True 和 False?

转载 作者:太空宇宙 更新时间:2023-11-04 05:52:52 25 4
gpt4 key购买 nike

根据这个问题的公认答案 What is the benefit of terminating if … else if constructs with an else clause?

有一个损坏案例(在嵌入式系统中)会导致一个 bool 变量 (这是 1 位) 不同于 True 和 False,这意味着这段代码中的else路径可以被覆盖,而不是死代码。

if (g_str.bool_variable == True) {
...
}
else if (g_str.bool_variable == False) {
...
}
else {
//handle error
}

我试图找出答案,但仍然没有任何线索。

这可能吗?如何?

编辑:为了更清楚,我将像这样给出 bool 变量的声明:

struct {
unsigned char bool_variable : 1;

} g_str;

同时定义:

#define True 1
#define False 0

最佳答案

unsigned char bool_variable : 1 不是 bool 变量。它是一个 1 位整数位字段。 _Bool bool_variable 是一个 bool 变量。

A bit-field shall have a type that is a qualified or unqualified version of _Bool, signed int, unsigned int, or some other implementation-defined type. It is implementation-defined whether atomic types are permitted. > C11dr §6.7.2.1

所以马上 unsigned char bool_variable : 1,如果允许的话,它是实现定义的。


如果这样的实现将 unsigned char 位字段处理为 int 位字段,因为 unsigned char 范围可以放入 int 范围,那么 1 位 int 位域就会出现问题。如果 1 位 int 位域采用 0, 10, -1 的值,则它是实现定义的。这导致此 if() block 的 //handle error 子句。

if (g_str.bool_variable == True) { // same as if (g_str.bool_variable == 1)
...
}
else if (g_str.bool_variable == False) { // same as if (g_str.bool_variable == 0)
...
}
else {
//handle error
}

解决方案是简化if()测试:

if (g_str.bool_variable) {
...
}
else {
...
}

有了bit-fields,在C中是一个角落,unsigned int,signed int不同,但是int位域较少比 int 的整个宽度可能被视为 signed intunsigned int。对于位字段,最好是显式的并使用 _Boolsigned intunsigned int。注意:使用 unsignedunsigned int 同义。

关于c - bool 变量如何不等于 True 和 False?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35075563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com