可以!a!= !! b ^ !! - !a ||!+!a |!c返回1以外的其他内容?

时间:2011-08-12 19:19:53

标签: javascript logic

我正和某人一起玩Javascript游戏,我们玩得很开心,制作荒谬和荒谬的表达方式,让我们的输入获得特定的输出。

这个小迷人的

!a!=!!b^!!-!a||!+!a|!c

似乎总是回归1。我试图推论出来,但是我在失去所有! s的跟踪后放弃了。

abc是否有任何不返回1的值?如果没有,为什么它总是返回1

6 个答案:

答案 0 :(得分:26)

简短的回答,是的。 a = false, b = false, c = true是一个反例,因为您的等式与(!!a || !!b || !c)相同。

答案很长:

!a!=!!b^!!-!a||!+!a|!c

(((!a) != (!!b)) ^ (!!(-!a))) || ((!+!a)|!c)

减少到

((Boolean(a) == Boolean(b)) ^ (!a)) || (Boolean(a) | !c)

所以abc的所有内容都只作为真值/假值处理,结果必须是10 |^都会将布尔值强加给数字。

很明显(通过检查||的权利)如果a是真实的或c是假的,那么你会得到1

如果a是假的且c是真的,那么您有两种可能性,

  1. b是真实的,在这种情况下,^条款为1,因此||的权利永远不会到达。
  2. b是假的,在这种情况下,^子句为0,因此||的权利支配产生0

答案 1 :(得分:9)

这个怎么样:

var a = undefined, b=undefined, c=!a
alert(!a!=!!b^!!-!a||!+!a|!c)
// Output: 0

Live demo.

答案 2 :(得分:4)

你有没有试过在几个循环中运行它:

for(var a = 0; a<100; a++) {
    for(var b = 0; b<100; b++) {  
        for(var c = 0; c<100; c++) {
            if((!a!=!!b^!!-!a||!+!a|!c) == 0) {
                console.log(a,b, c);
            }
        }
    }
}


a b c
=====
0 0 1
0 0 2
0 0 3
0 0 4
0 0 5
0 0 6
0 0 7
0 0 8
0 0 9
0 0 10
0 0 11
0 0 12
0 0 13
0 0 14
0 0 15
0 0 16
0 0 17
0 0 18
0 0 19
0 0 20
0 0 21
0 0 22
0 0 23
0 0 24
0 0 25
0 0 26
0 0 27
0 0 28
0 0 29
0 0 30
0 0 31
0 0 32
0 0 33
0 0 34
0 0 35
0 0 36
0 0 37
0 0 38
0 0 39
0 0 40
0 0 41
0 0 42
0 0 43
0 0 44
0 0 45
0 0 46
0 0 47
0 0 48
0 0 49
0 0 50
0 0 51
0 0 52
0 0 53
0 0 54
0 0 55
0 0 56
0 0 57
0 0 58
0 0 59
0 0 60
0 0 61
0 0 62
0 0 63
0 0 64
0 0 65
0 0 66
0 0 67
0 0 68
0 0 69
0 0 70
0 0 71
0 0 72
0 0 73
0 0 74
0 0 75
0 0 76
0 0 77
0 0 78
0 0 79
0 0 80
0 0 81
0 0 82
0 0 83
0 0 84
0 0 85
0 0 86
0 0 87
0 0 88
0 0 89
0 0 90
0 0 91
0 0 92
0 0 93
0 0 94
0 0 95
0 0 96
0 0 97
0 0 98
0 0 99

答案 3 :(得分:3)

试试此演示:http://jsfiddle.net/ugfsW/

a = 0,b = 0,c = 1 =&gt;结果:0

如果a=0, b=0(c不具有判别力),结果始终为 0
我假设Domain(a)= Domain(b)= Domain(c)

答案 4 :(得分:1)

一些逻辑表达式是tautologies,即它们总是正确的。可能是你找到了一个。尝试verify it

答案 5 :(得分:0)

您应该使用模型检查器。它将为您提供输出0或1的所有值:-) Spin是一个非常受欢迎的模型检查器。