Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2019, 17:49   #1
bealey
Новичок
Джуниор
 
Регистрация: 23.03.2019
Сообщений: 1
По умолчанию Не пойму почему

Случайно обнаружил и не могу понять почему так происходит, объясните

Код:
i = 5; 
var x = prompt ('Введите число');
if (x == i-- || x == i++) {alert ('Почти попал')};
Выполнение при вводе "4" alert выводит, а ввод "6" нет. Если в условии поменять местами i-- и i++, соответственно "работать" будет шестерка, а 4 перестанет. В том и в другом случае ввод "5" также удовлетворяет условию. Отсюда делаю вывод, что i пересчитывается в условии его первой частью.
Но при этом:

Код:
i = 5; 
var x = prompt ('Введите число');
if (x == i+1 || x == i-1) {alert ('Почти попал')};
работает как надо.
Почему так?
bealey вне форума Ответить с цитированием
Старый 23.03.2019, 18:19   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Сообщение от bealey Посмотреть сообщение
Отсюда делаю вывод, что i пересчитывается в условии его первой частью
У вас стоит постинкремент. Он действительно пересчитывает значение своего операнда. При этом, сначала идёт сравнение, а потом уже увеличение (это ПОСТинкремент). Также следует учитывать, что оператор "ЛОГИЧЕСКОЕ ИЛИ" работает так: он последовательно проверяет свои операнды на истинность. Если очередной операнд оказывается истинным, то он прекращает его выполнение и возвращает истину. Если ложь, то идёт дальше. Если он так и не нашёл истину, то он возвращает ложь. Давайте с учётом этого посмотрим, как работает ваш код. Вы задали для переменной x значение 5. На самом деле, переменная x имеет строковый тип, но у вас используется сравнение с преобразованием типов (==), поэтому это неважно. Просто имейте в виду, что promt, если его что-то ввели, возвращает строку, а не число.

Допустим, ввели 4.
Заходим, в условие, первых операнд: 4 == 5 — это верно? Нет, мы уменьшаем значение i с 5 до 4 и смотрим дальше. 4 равно 4? Да, но мы потом выполним инкремент, оть он нам больше не нужен.

Попробуйте порассуждать аналогичным образом для 6.
_____________________

Последний пример работает из-за того, что для 4 у вас истинен второй операнд, а для 6 — первый.

Последний раз редактировалось Вадим Мошев; 23.03.2019 в 18:28.
Вадим Мошев вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не пойму почему Borkot Общие вопросы C/C++ 3 09.06.2013 22:33
Не пойму почему не работало ((( firephenix Помощь студентам 2 16.10.2012 20:25
with ... do - не пойму почему ошибка MyLastHit Общие вопросы Delphi 2 23.12.2010 15:26
не пойму почему так (comm32) yuta_86 Общие вопросы Delphi 11 15.12.2010 16:07
не пойму почему. spaun88 Общие вопросы Delphi 8 09.06.2010 17:26