【问题标题】:Compare two bools with different int value比较两个具有不同 int 值的 bool
【发布时间】:2021-06-16 18:08:25
【问题描述】:
#include <stdbool.h>                                                            
#include <stdio.h>                                                                 
int main ()                                                                        
{                                                                                  
    bool a, b;                                                                     
    a = 1;                                                                         
    b = 4;                                                                         
                                                                                   
    if (a == b)                                                                    
        printf ("They are equal\n");                                               
    else                                                                           
        printf ("They are different\n");                                           
}

此代码打印They are equal

  • 怎么会这样?变量ab 是否在赋值中填充了值0x1,而不管我为它们分配了什么?或者可能是被黑客入侵以处理bools 的==
  • 此行为是否可跨 C 标准库实现和编译器移植?
  • 在引入stdbool.h 之前,逻辑比较两个bool/int 的正确方法是什么?

【问题讨论】:

  • 参见C11 6.3.1.2当任何标量值转换为_Bool时,如果值比较等于0,则结果为0;否则,结果是1 所以你的b 会自动分配给1
  • 4(任何非0值)表示true
  • @WeatherVane 我认为 OP 想知道b 是否转换为1,因为否则这两个布尔值将以不同的方式存储在内存中,并且无法使用== 进行比较。
  • @AndySukowski-Bang 我的意思是存储的值将是true,因为4 被认为是真实的。
  • @WeatherVane 我理解你的意思,但是如果bool b 被存储为4,它在内存中会是这样的00000100,但它与bool a 不同,它将像这样存储00000001。因此bool b需要转换为1

标签: c boolean comparison-operators c-standard-library


【解决方案1】:

怎么会这样?

两个变量都是1,所以它们相等。

变量 a 和 b 在赋值中是否填充了值 0x1,而不管我为它们分配了什么?

好吧,不管怎样。任何非零值都转换为1并分配给bool。零值将用... 0 填充它们。

或者也许是 == 已被破解来处理布尔值?

没有。

bool 是一个扩展为_Bool 的宏,而_Bool 变量在为其赋值时具有特殊语义。

这种行为是否可以跨 C 标准库实现和编译器移植?

是的。

在引入 stdbool.h 之前,逻辑比较两个布尔值的正确方法是什么?

bool 不是_Bool,而是类似于int 时,您可以使用双逻辑非将赋值或比较的值转换为0 或1:

if (!!a == !!b)      

【讨论】:

  • 其实if (!a == !b)(单个!)也是有效的
【解决方案2】:

C11, 6.3.1.2 说:

当任何标量值转换为 _Bool 时,如果 值比较等于 0;否则,结果为 1。

当您将 4 分配给 b 时,它只是分配给 1。所以是的,这种行为是由 C 标准保证的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多