提问人:user2706764 提问时间:9/4/2023 最后编辑:Vlad from Moscowuser2706764 更新时间:9/4/2023 访问量:46
~(true)在环境中的值是多少?并需要答案理由
what will be the value of ~(true) in environment? and need answer justification
问:
最近,当我遇到下面的程序时,我遇到了一个奇怪的观察结果。
// 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;”相同,按预期工作。
答:
- 和 之间的区别。
!
~
!
不合逻辑。任何非零值变为零,零变为1
~
按位 NOT - 否定值的按位表示中的所有位。它只能应用于整数值。 变成两个补码整数~1
-2
C 标准 7.16.3:
其余三个宏适用于 #if 预处理 指令。它们是真的,它扩展到整数常数 1, false,扩展为整数常量 0
6.2.5.2
声明为类型 _Bool 的对象足够大,可以存储值 0 和 1.
最小的类型是,它的大小(以位为单位)为(最小 8)char
CHAR_BIT
隐式转换适用:
bool abc = true;
bool bac = ~abc;
abc
转换为 并具有int
1
~
操作应用于值int
1
- 结果 - 不为零 - 转换回布尔值 - 并且它具有价值,因为在语言中,任何非零值都被视为 。
true
C
true
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
一元运算符 和 具有不同的效果。来自 C 标准(6.5.3.3 一元算术运算符)!
~
5 逻辑否定算子的结果!如果值为 它的操作数与 0 相比不等于 0,如果其操作数的值为 1 比较等于 0。结果的类型为 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
FFFFFFFE
0
bac
1
因此,带有逻辑 AND 运算符的条件
cba && bac
也将等于 1。
评论
0b000....0001