为什么Java中的布尔表达式!!(a||!a)的返回结果恒为true?
核心逻辑拆解
你的推导是完全正确的:布尔值的双重否定!!等价于原值,即!!x和x的布尔结果完全一致,三个感叹号!!!x则等价于!x。
你疑惑的点可以拆成两步按计算顺序推导,Java表达式会优先计算括号内的内容,再处理外层运算符:
第一步:计算括号内的 a || !a
这是逻辑运算里的排中律,对于任意布尔类型的变量a,只存在两种取值可能:
- 当
a为true时,!a为false,true || false结果为true - 当
a为false时,!a为true,false || true结果为true
也就是说不管a取什么布尔值,括号内的运算结果永远是true。
第二步:处理外层的双重否定!!
按照你已经推导正确的规则,!!等价于原值,所以!!true的结果自然就是true。
逐值验证
你也可以代入两种取值手动算一遍验证:
- 当
a = true时:a || !a=true || false=true!true=false!false=true→ 最终结果为true
- 当
a = false时:a || !a=false || true=true!true=false!false=true→ 最终结果还是true
补充个小知识点:在弱类型语言里双重否定常用来把其他类型的值强制转成布尔类型,Java是强类型语言,所以这个表达式里的!!其实没有改变运算结果的作用,去掉之后(a||!a)本身也永远返回true。
内容的提问来源于stack exchange,提问作者mhcx
相关产品推荐
相关产品推荐

