C语言 环境中的~(true)值是多少?并需要回答的理由

s6fujrry  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(86)

我最近遇到了一个奇怪的观察,当我遇到下面的程序。

// Write C code here

bool abc = true;
bool cba = true;
bool bac = ~abc;

if(cba && bac)
{
    printf("\nYES! %d", bac);
}
else
{
    printf("\nNO! %d", bac);
}
return 0;

在上面的程序中,我观察到,即使abc为真,if语句也会被执行,而不是else。任何解释都将受到欢迎。
注:但与“bool bac =!abc;",按预期工作。

l3zydbqr

l3zydbqr1#

  1. !~的区别
  • !逻辑非。任何非零值变为零,零变为1
  • ~按位不对值的按位表示中的所有位求反。它只能应用于整数值。~1在两个补整数中变为-2

C标准7.16.3:
剩下的三个宏适合在#if预处理指令中使用。它们是true,扩展为整数常量1,false,扩展为整数常量0
6.2.5.2
声明为type _Bool的对象足够大,可以存储值0和1。
最小的类型是char,它的大小(以位为单位)为CHAR_BIT(最小8)
隐式转换适用于:

bool abc = true;
bool bac = ~abc;
  1. abc转换为int,其值为1
  2. ~运算应用于int1
    1.结果(不为零)被转换回bool,它的值为true,就像在C中一样,任何非零值都被认为是true
  3. bac的值为true
    ~(true)的值是多少
    它将是一个整数,其值为~1
    ~反转逻辑值的唯一方法是使用大小为1的整数位域
typedef struct
{
    unsigned val:1;
}mybool;

int main(void)
{
    mybool abc = {true};
    mybool cba = {true};
    mybool bac = {~abc.val};

    if(cba.val && bac.val)
    {
        printf("\nYES! %u", bac.val);
    }
    else
    {
        printf("\nNO! %u", bac.val);
    }
}

https://godbolt.org/z/bjz6T4vTK

xytpbqjk

xytpbqjk2#

一元运算符!~具有不同的效果。来自C标准(6.5.3.3一元算术运算符)
5逻辑求反运算符的结果!如果其操作数的值不等于0,则为0,如果其操作数的值等于0,则为1。结果类型为int。表情!E等于(0==E)。
所以在这条线上

bool bac = !abc;

表达式!abc的结果是0。这个值被赋给变量bac
因此,if语句中带有逻辑AND运算符的条件

cba && bac

也计算为0
4 ~运算符的结果是其(提升)操作数的按位补码(即,当且仅当转换后的操作数中的相应位未置位时,结果中的每一位都被置位)。对操作数执行整数提升,结果具有提升类型。如果提升的类型是无符号类型,表达式~E等效于该类型中可表示的最大值减去E。
所以在这条线上

bool bac = ~abc;

运算符~的操作数abc被提升为类型int,并且如果sizeof( int )等于4,则结果将是不等于0FFFFFFFE。将此非零表达式转换为变量bac,使变量等于1
因此,具有逻辑AND运算符的条件

cba && bac

也将等于1。

相关问题