我遇到了一个答案,我似乎无法弄清楚为什么它是正确的 .
因此有两个int变量x和y,它们分别代表0x66和0x39 .
问题是基于表达式的结果值是什么 .
x && y is apparently 0x01 (1)
x || y is 1
!x || !y is 0
x && ~y is 1
从我的想法来看,我认为只要一个论证不是零就认为是真的 . 因此只要x和y是一些非零值,那么&&运算符就会产生1,当然只要其中一个是真的||运营商会产生1 .
那么为什么第三个问题为0?是个 !与bitwise~运算符不同?所以原来x是二进制的0101 0101,因为它不是零,在逻辑意义上它是真的,但是!它会是假的,还是它的数字的补码所以它的1010 1010?
4 回答
这都是正确的 .
是 . 这是合乎逻辑的 . 就像其他逻辑运算符
&&
和||
一样,它只关心变量是否具有非零值 .!0
将产生1
.!non_zero
将产生0
.请注意,C中的所有逻辑运算符都是
int
而不是bool
,因为丑陋的向后兼容性保留在C具有布尔类型之前 . 在C和其他类C语言中,逻辑运算符总是产生类型bool
.类似地,C中的
true
和false
实际上只是扩展为整数1
和0
的宏 . 在其他语言中,它们是关键字和布尔常量 .布尔结果总是为true或false,而在C中,true由
1
表示,false由0
表示 .逻辑非运算符
!
给出布尔结果,即1
或0
. 因此,如果表达式为"true"(即非零),则在该表达式上应用!
将使其为假,即0
.在您的示例中,您有
!x || !y
. 首先评估!x
,它的计算结果为false,导致!y
被评估,并且它也计算为false,因此while表达式变为false,即0
.是的,
!
与按位不同~
不同 . 这是合乎逻辑的 . 它产生0或1 .〜(0x01)将为0x10,而!(0x01)将为0x00
'〜'是一个按位运算符 . '!'是一个逻辑运算符 .