0
#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

  • 这怎么可能发生?无论我为它们分配什么,变量a和赋值中b的值是否都被填充?0x1或者也许是==被黑客入侵来处理bools 的?
  • 这种行为是否可以跨 C 标准库实现和编译器移植?
  • 在引入 之前,在逻辑上比较两个bool/的正确方法是什么?intstdbool.h
4

2 回答 2

1

这怎么可能发生?

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

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

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

或者也许是被黑来处理布尔值的 == ?

不。

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

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

是的。

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

When boolis not an _Bool, but like an int,您可以使用双逻辑非将赋值或比较的值转换为 0 或 1:

if (!!a == !!b)      
于 2021-03-19T10:32:46.237 回答
1

C11,6.3.1.2说:

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

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

于 2021-03-19T10:34:40.770 回答