Может! A! =!! b ^!! -! A ||! +! A |! C вернуть что-либо, кроме 1?
Я играл с Javascript-игрой с кем-то, и мы веселились, делая смешные и абсурдные выражения, чтобы наши входы получали определенный результат.
Этот маленький очаровательный
!a!=!!b^!!-!a||!+!a|!c
всегда возвращался 1
. Я попытался объяснить это, но я отказался от потери всех !
s.
Есть ли значения для a
, b
и c
, которые не возвращают 1
? Если нет, то почему он всегда возвращает 1
?
Ответы
Ответ 1
Короткий ответ, да. 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)
поэтому все a
, b
и c
рассматриваются только как значения правды/ложности, и результат должен быть 1
или 0
, так как |
и ^
оба принудительного булева к номерам.
Итак, очевидно (из проверки права на ||
), если либо a
является правдивым, либо c
является ложным, вы получаете 1
.
Если a
ложно и c
правдиво, у вас есть две возможности:
-
b
является правдой, в этом случае предложение ^
равно 1
, поэтому право на ||
никогда не достигается.
-
b
false, и в этом случае предложение ^
равно 0
, поэтому право ||
доминирует для создания 0
.
Ответ 2
Как насчет этого:
var a = undefined, b=undefined, c=!a
alert(!a!=!!b^!!-!a||!+!a|!c)
// Output: 0
Live demo.
Ответ 3
Вы даже попробовали запустить его в нескольких циклах:
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
Ответ 4
Попробуйте эту демонстрацию: http://jsfiddle.net/ugfsW/
a = 0, b = 0, c = 1 = > Результат: 0
Результат всегда 0, если у вас a = 0, b = 0 (c не является дискриминантным).
Я предполагаю, что Domain (a) = Domain (b) = Domain (c)
Ответ 5
Некоторые логические выражения тавтологии, т.е. они всегда верны. Возможно, вы нашли его. Попробуйте подтвердить его.
Ответ 6
Вы должны использовать контрольную модель для этого. Он даст вам все значения, которые будут выводить 0 или 1:-) Spin - очень популярная проверка модели, например.