Я грав на jsfiddle.net і мені цікаво, чому це повертається правдою?
if(0 < 5 < 3) {
alert("True");
}
Так і відбувається:
if(0 < 5 < 2) {
alert("True");
}
Але це не так:
if(0 < 5 < 1) {
alert("True");
}
Чи корисна ця примха?
Я грав на jsfiddle.net і мені цікаво, чому це повертається правдою?
if(0 < 5 < 3) {
alert("True");
}
Так і відбувається:
if(0 < 5 < 2) {
alert("True");
}
Але це не так:
if(0 < 5 < 1) {
alert("True");
}
Чи корисна ця примха?
Відповіді:
Порядок операцій спричиняє (0 < 5 < 3)
інтерпретацію JavaScript у тому, ((0 < 5) < 3)
що виробляє (true < 3)
та істинно, зараховується як 1, що призводить до повернення істини.
Це також, чому (0 < 5 < 1)
повертає false, (0 < 5)
повертає true, що інтерпретується як 1
, в результаті чого (1 < 1)
.
if(0 < 5 < 1) == false
. Тепер все зрозуміло, спасибі :)
((0 < 5) && (5 < 3))
, мабуть, є й інші, але я не знаю їх.
Я думаю, тому що 0 < 5
це правда, і true < 3
отримує кидок на 1 < 3
який вірно.
Що стосується вашого запитання, чи корисна ця витівка: я вважаю, що може бути корисною ситуацію (якщо стислий код - це те, що ви шукаєте), але покладаючись на нього, (швидше за все), це значно знизить зрозумілість вашого коду.
Це схоже на використання пост / попереднього збільшення / декременту як частини більшого вираження. Чи можете ви з першого погляду визначити, який результат цього коду?
int x = 5;
int result = ++x + x++ + --x;
Примітка. За допомогою цього коду ви можете іноді навіть отримувати різні результати, залежно від мови та компілятора.
Це гарна ідея, щоб полегшити життя собі та наступному хлопцеві, який прочитає ваш код. Чітко випишіть, що ви насправді хочете, щоб сталося, а не покладалися на такі побічні ефекти, як неявна конверсія булів.
result
18?
Відповідь на другу частину питання "чи корисна ця примха?" це, мабуть, ні, як зазначалося в попередній відповіді, якщо це дійсно вигадка мови (Javascript), що true передається до 1, але що програміст загалом не переглядає 1, а true (і 0 і false) як однакові речі.
Якщо ж у вас є ментальна модель: 1 є правдою, а 0 - хибною, то це призводить до всіляких приємних бульних методів, які є надзвичайно корисними, потужними та прямими. Наприклад, ви можете збільшити лічильник безпосередньо з результатом A> 100, що збільшило б лічильник, якщо A більше 100. Ця техніка може розглядатися як химерність або хитрість на Java, але в масиві або функціональній мові може бути ідіоматичним.
Класичним прикладом APL мови масиву може бути підрахунок кількості елементів у масиві, що (скажімо) перевищує 100:
+/A>100
Де, якщо A - це масив 5 елементів 107 22 256 110 3, тоді:
A>100
виходить бульовий масив з 5 елементів:
1 0 1 1 0
і підбиття цього булевого результату:
+/1 0 1 1 0
дає остаточну відповідь:
3
Це питання є прекрасним прикладом, коли ця методика була б дуже корисною, особливо якщо проблема узагальнена для визначення того, чи n з m булевих значень істинно.
Перевірте, чи принаймні два з трьох булевих значень справжні
Це легко.
(0 < 5 < 3)
Почніть зліва направо, щоб вона оцінювала перші 0 <5. Це правда? Так. Оскільки ІСТИНА = 1, вона оцінює 1 <3. Оскільки 1 менше 3, то це правда.
Тепер з цим
(0 < 5 < 1)
Чи 0 менше 5? Так. Отже, зробіть це ІСТИНО, що також означає 1. Тепер, маючи на увазі цей факт, він оцінює до (1 <1). Чи на 1 менше 1? Ні, тому це помилково. Він повинен бути рівним.
чи оцінює 0 <5, що поверне 1 для істинного, коли 1 <3, що відповідає дійсності?
C # хочу дозволити вам зробити це "Оператор" <"не можна застосовувати до операндів типу" bool "і" int ""
0 < 5 < 3
==> ( ( 0 < 5 ) < 3 )
==> true < 3
==> 1 < 3
==> true
Булевий операнд при роботі з математичним оператором повертає число. щоб перевірити це ми робимо
true + 1 which gives you 2.
Отже 0 < 5
, повернута булева (справжня), оперована з математичним оператором (<), поверне число. Отже, вона кипить до 1 <3, яка повертаєтьсяtrue
спробуйте сформулювати результати як номер ()
if(Number(0) < Number(5) < Number(3)) {
alert("True");
}
або спробуйте це:
if(Number(0) < Number(5) && Number(5) < Number(3)) {
alert("True");
}
Я переглянув це через Google, тому що я отримував, (3 >= 20) //returning true
і я думаю, що JavaScript намагався перевірити 3
як булевий, тому що я отримував це значення з elm.getAttribute();
функції, яка console.log();
друкувалася у String формі.