我最近遇到了一个奇怪的观察,当我遇到下面的程序。
// 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;",按预期工作。
2条答案
按热度按时间l3zydbqr1#
!
和~
的区别!
逻辑非。任何非零值变为零,零变为1
~
按位不对值的按位表示中的所有位求反。它只能应用于整数值。~1
在两个补整数中变为-2
C标准7.16.3:
剩下的三个宏适合在#if预处理指令中使用。它们是true,扩展为整数常量1,false,扩展为整数常量0
6.2.5.2
声明为type _Bool的对象足够大,可以存储值0和1。
最小的类型是
char
,它的大小(以位为单位)为CHAR_BIT
(最小8)隐式转换适用于:
abc
转换为int
,其值为1
~
运算应用于int
值1
1.结果(不为零)被转换回bool,它的值为
true
,就像在C
中一样,任何非零值都被认为是true
。bac
的值为true
~(true)的值是多少
它将是一个整数,其值为
~1
~
反转逻辑值的唯一方法是使用大小为1
的整数位域https://godbolt.org/z/bjz6T4vTK
xytpbqjk2#
一元运算符
!
和~
具有不同的效果。来自C标准(6.5.3.3一元算术运算符)5逻辑求反运算符的结果!如果其操作数的值不等于0,则为0,如果其操作数的值等于0,则为1。结果类型为int。表情!E等于(0==E)。
所以在这条线上
表达式
!abc
的结果是0
。这个值被赋给变量bac
。因此,if语句中带有逻辑AND运算符的条件
也计算为
0
。4 ~运算符的结果是其(提升)操作数的按位补码(即,当且仅当转换后的操作数中的相应位未置位时,结果中的每一位都被置位)。对操作数执行整数提升,结果具有提升类型。如果提升的类型是无符号类型,表达式~E等效于该类型中可表示的最大值减去E。
所以在这条线上
运算符
~
的操作数abc
被提升为类型int
,并且如果sizeof( int )
等于4
,则结果将是不等于0
的FFFFFFFE
。将此非零表达式转换为变量bac
,使变量等于1
。因此,具有逻辑AND运算符的条件
也将等于1。