Как понять код?
|
|
vladh |
Дата: Пт, 19.07.2019, 10:07 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
260
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Уважаемые, подскажите. В одном из прилагаемых к программе примеров есть такой код: while TRUE
for counter = 0 to 7
LATA = LATA or 1 << counter
LATB = LATB or 1 << counter
LATC = LATC or 1 << counter
LATD = LATD or 1 << counter
LATE = LATE or 1 << counter
Wait()
next counter
counter = 0
while (counter < 8)
LATA = LATA and not(1 << counter)
LATB = LATB and not(1 << counter)
LATC = LATC and not(1 << counter)
LATD = LATD and not(1 << counter)
LATE = LATE and not(1 << counter)
wait()
Inc(counter)
wend
wend На мой взгляд он написан в стиле СИ. И из за этого этот язык мною трудно понимаем. Так вот объясните пожалуйста бестолковому, что означает строка LATA = LATA or 1 << counter
и строка LATA = LATA and not(1 << counter) ? Я, например, читаю первую строку как состояние регистра не меняется ИЛИ произвести сдвиг значение этого регистра влево на 1!?
|
|
|
|
kits |
Дата: Пт, 19.07.2019, 11:10 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
18
Замечания:
±
На сайте с 13.04.2015
Статус:
Offline
|
Цитата vladh (  ) Так вот объясните пожалуйста бестолковому, что означает строка LATA = LATA or 1 << counter Сдвиг 1 влево на число в переменной counter, а после побитовое ИЛИ LATA. Производится установка бита указанного в переменой counter. То есть если в ней был 0, установится 0 бит, если 2, установится 2 бит.
Цитата vladh (  ) и строка LATA = LATA and not(1 << counter) ? Аналогично предыдущему. Сдвиг влево, инвертирование и побитовое И. Биты сбрасываются.
|
|
|
|
ivan_fd |
Дата: Пт, 19.07.2019, 15:51 | Сообщение # 3 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
897
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата vladh (  ) На мой взгляд он написан в стиле СИ.
Если точнее, то в стиле VisualBasic. И в Протоне код выглядел бы, почти так же.
Код For counter = 0 to 7 LATA = LATA | (1 << counter) LATB = LATB | (1 << counter) LATC = LATC | (1 << counter) LATD = LATD | (1 << counter) LATE = LATE | (1 << counter) DelayMS(1000) Next
|
|
|
|
vladh |
Дата: Сб, 20.07.2019, 06:13 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
260
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата kits (  ) Сдвиг 1 влево на число в переменной counter, а после побитовое ИЛИ LATA. Производится установка бита указанного в переменой counter. То есть если в ней был 0, установится 0 бит, если 2, установится 2 бит. Спасибо, kits. Но вот почему выполнение операций идет не так как я думаю? Согласно правилам математики выполняются операции выполняются слева направо. Этот порядок нарушается если имеются выражения в скобках или операции умножения/деления. Т.е. Во втором цикле как бы все становится на места описанные вами(там присутствуют скобки). А вот в первом почему не так?Добавлено (20.07.2019, 06:23) ---------------------------------------------
Цитата ivan_fd (  ) И в Протоне код выглядел бы, почти так же. Спасибо, Иван. Но вот сейчас я обратил внимание на одну вещь. Я попробовал Ваш код засунуть в Протон. Действительно почти все прошло без ругательств(кроме DelayMs(1000)). Но я никогда в своих программах не использовал ни символа "|", ни символа "&" и т.п. Я всегда писал "Or" и "And". Но вот сейчас я попробовал в Вашем коде заменить "|" на "Or" и тогда компилятор выдал ошибки. Что это значит, как Вы думаете?
|
|
|
|
ivan_fd |
Дата: Сб, 20.07.2019, 11:25 | Сообщение # 5 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
897
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата vladh (  ) Согласно правилам математики выполняются операции выполняются слева направо. Этот порядок нарушается если имеются выражения в скобках или операции умножения/деления. Т.е. Во втором цикле как бы все становится на места описанные вами(там присутствуют скобки). А вот в первом почему не так?
Тут немного не так как в математике. Каждый оператор имеет свой приоритет. В первом случаи, логический сдвиг имеет выше приоритет, чем логическое ИЛИ, поэтому скобки не нужны. Хотя поставить их не помешает, логичнее програма читается. Кстати в Протоне скобки нужны, иначе считает не верно. Во втором:
Цитата vladh (  ) LATA = LATA and not(1 << counter) нужны скобки, поскольку логическое НЕ и побитовое НЕ имеет выше приоритет, чем операция сдвига. Поэтому, если не поставить скобки, логическое не применится к 1-це, а не ко всему сдвигу.
Цитата vladh (  ) Спасибо, Иван. Но вот сейчас я обратил внимание на одну вещь. Я попробовал Ваш код засунуть в Протон. Действительно почти все прошло без ругательств(кроме DelayMs(1000)). Но я никогда в своих программах не использовал ни символа "|", ни символа "&" и т.п. Я всегда писал "Or" и "And". Но вот сейчас я попробовал в Вашем коде заменить "|" на "Or" и тогда компилятор выдал ошибки. Что это значит, как Вы думаете? Вот из помощи ПРОТОНА:
Цитата Logical operators Bitwise and '&' Bitwise or '|' Bitwise xor '^' Bitwise Shift Left '<<' Bitwise Shift Right '>>' Bitwise Complement '~' Bitwise Reverse '@' Returns the logical AND of two values.
А на счет DelayMS(1000) . Какая версия протона у Вас. У меня 3.7.1.6.
|
|
|
|
vladh |
Дата: Сб, 20.07.2019, 12:36 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
260
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ivan_fd (  ) А на счет DelayMS(1000) . Какая версия протона у Вас. У меня 3.7.1.6.
У меня 3,5,8,6. А все таки как насчет:
Цитата vladh (  ) Но я никогда в своих программах не использовал ни символа "|", ни символа "&" и т.п. Я всегда писал "Or" и "And". Но вот сейчас я попробовал в Вашем коде заменить "|" на "Or" и тогда компилятор выдал ошибки. Что это значит, как Вы думаете? Т.е. почему эти разные записи операторов не равноправны?
Сообщение отредактировал
vladh - Сб, 20.07.2019, 12:38
|
|
|
|
ivan_fd |
Дата: Сб, 20.07.2019, 15:31 | Сообщение # 7 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
897
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Потому, что в Протоне такой синтаксис. В МикроБейсике другой. В C, например, так же как и в Протоне. Не OR, а |.
|
|
|
|
vladh |
Дата: Сб, 20.07.2019, 18:29 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
260
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ivan_fd (  ) Потому, что в Протоне такой синтаксис. В МикроБейсике другой. В C, например, так же как и в Протоне.Не OR, а |.
Иван, Вы наверное меня не поняли(или я чего то понять не могу). Я обычно в своих программах на Протоне использую логический оператор Or и никогда "|". Например кусок кода моей программы:
Цитата Repeat GoSub KeyPad Until Key = 1 Or Key = 2 Or Key = 3 Or Key = 4 Or Key = 11
Этот код компилируется без проблем. Даже если я поменяю Or на |. Когда же в Вашем примере я попытался вертикальную черту заменить на этот оператор компилятор высказал мне своё фи. Почему? Когда можно использовать Or, а когда |?
Сообщение отредактировал
vladh - Сб, 20.07.2019, 18:36
|
|
|
|
kits |
Дата: Сб, 20.07.2019, 18:52 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
18
Замечания:
±
На сайте с 13.04.2015
Статус:
Offline
|
В многих бейсиках Or это логический, а | битовый оператор. То есть первый используется как в вашем примере с Until, а второй для установки битов.
|
|
|
|
ivan_fd |
Дата: Сб, 20.07.2019, 20:24 | Сообщение # 10 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
897
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Теперь понял, что Вы имели ввиду. Вам выше уже ответили. Можете, так же посмотреть файл помощи: Boolean Logic Operators
|
|
|
|
vladh |
Дата: Вс, 21.07.2019, 08:29 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
260
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
kits и ivan_fd, большое вам спасибо. Очередной раз заглянув в Help обратил внимание, что Or и | это разные операторы. Они относятся к разным группам и выполняют разные функции. А это значит, что механическая их замена будет неправильным действием! И еще. Я до этого никогда не задумывался над тем, что у логических операторов также присутствует разделение по старшинству. Иван правильно обратил внимание, что желательно всегда ставить скобки дабы не было путаницы.
Сообщение отредактировал
vladh - Вс, 21.07.2019, 08:37
|
|
|
|
kits |
Дата: Вс, 21.07.2019, 13:27 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
18
Замечания:
±
На сайте с 13.04.2015
Статус:
Offline
|
Цитата vladh (  ) Я до этого никогда не задумывался над тем, что у логических операторов также присутствует разделение по старшинству. Посмотрите справку на интересующий бейсик. Должна быть таблица похожая на эту (это разновидность бейсика для компа).
Сообщение отредактировал
kits - Вс, 21.07.2019, 13:28
|
|
|
|
vladh |
Дата: Пн, 22.07.2019, 06:42 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
260
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата kits (  ) Посмотрите справку на интересующий бейсик. Должна быть таблица похожая на эту (это разновидность бейсика для компа).
В моем хелпе написано мало. Я нашел только это:
Цитата The boolean operands do have a precedence within a condition. The and operand has the
highest priority, then the or, then the xor. This means that a condition such as
Поэтому прихожу к выводу, что правильней будет сильно не задумываться какой оператор имеет высший приоритет, а просто использовать скобки для расстановки приоритетов операций. У МикроБейсика я вообще не нашел указания на приоритетность логических операторов.
Сообщение отредактировал
vladh - Пн, 22.07.2019, 06:50
|
|
|
|
Antonionwo |
Дата: Ср, 22.06.2022, 00:13 | Сообщение # 14 |
Группа:
Пользователи
Ранг:
Начал соображать
Сообщений:
31
Замечания:
±
На сайте с 31.01.2021
Статус:
Offline
|
Добрый день друзья! Предлагаем Вашему вниманию замечательный сайт https://dengi-do-zarplaty.ru/ Конечно, никто не хочет давать деньги в долг и особенно никому не хочется брать их взаймы. Но иногда ситуация решает за нас и приходится очень срочно искать, откуда взять деньги. В первую очередь обычно обращаются к родственникам, друзьям, коллегам по работе, партнерам по бизнесу, но во многих случаях они могут отказать. Хорошим выбором будет обратиться в финансовую компанию, в которой можно на выгодных условиях взять кредит, чтобы улучшить свое положение. Причем важно не только оформить кредит быстро с хорошими требованиями, но и взять кредит наличными под низкий процент. Никто не хочет влезать в долги, которые еще не понятно, как придется отдавать.
тонировка окон пвх
|
|
|
|