~(true)在环境中的值是多少?并需要答案理由

what will be the value of ~(true) in environment? and need answer justification

提问人:user2706764 提问时间:9/4/2023 最后编辑:Vlad from Moscowuser2706764 更新时间:9/4/2023 访问量:46

问:

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

// 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 为 true,if 语句正在执行,而不是其他。任何解释将不胜感激。

注意:但与“bool bac = !abc;”相同,按预期工作。

c if 语句 布尔 一元运算符

评论

3赞 Andrew Henle 9/4/2023
你认为将会是什么的按位补码?0b000....0001

答:

2赞 0___________ 9/4/2023 #1
  1. 和 之间的区别。!~
  • !不合逻辑。任何非零值变为零,零变为1
  • ~按位 NOT - 否定值的按位表示中的所有位。它只能应用于整数值。 变成两个补码整数~1-2

C 标准 7.16.3:

其余三个宏适用于 #if 预处理 指令。它们是真的,它扩展到整数常数 1, false,扩展为整数常量 0

6.2.5.2

声明为类型 _Bool 的对象足够大,可以存储值 0 和 1.

最小的类型是,它的大小(以位为单位)为(最小 8)charCHAR_BIT

隐式转换适用:

bool abc = true;
bool bac = ~abc;
  1. abc转换为 并具有int1
  2. ~操作应用于值int1
  3. 结果 - 不为零 - 转换回布尔值 - 并且它具有价值,因为在语言中,任何非零值都被视为 。trueCtrue
  4. 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

1赞 Vlad from Moscow 9/4/2023 #2

一元运算符 和 具有不同的效果。来自 C 标准(6.5.3.3 一元算术运算符)!~

5 逻辑否定算子的结果!如果值为 它的操作数与 0 相比不等于 0,如果其操作数的值为 1 比较等于 0。结果的类型为 int。表情 !E 是 等价于 (0==E)。

所以在这一行

bool bac = !abc;

表达式的结果是 。并将此值分配给变量 。!abc0bac

因此,if 语句中带有逻辑 AND 运算符的条件

cba && bac

计算结果也为 。0

4 ~ 运算符的结果是其 (提升)操作数(即,结果中的每个位都设置为当且仅 如果未设置转换后的操作数中的相应位)。这 在操作数上执行整数升级,结果 提升类型。如果提升的类型是无符号类型,则 表达式 ~E 等价于其中可表示的最大值 类型减去 E。

所以在这一行

bool bac = ~abc;

运算符的操作数被提升为类型,如果等于,则结果将是 不等于 。将此非零表达式分配给变量会使变量等于 。abc~intsizeof( int )4FFFFFFFE0bac1

因此,带有逻辑 AND 运算符的条件

cba && bac

也将等于 1。