| Как понять код? | 
|  | 
| 
 
 
 
 | vladh | Дата: Пт, 19.07.2019, 10:07  |                                                                                                                Сообщение # 1 |  
 | ![vladh]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 258
 
 
 Замечания: ± На сайте с 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 |  
 | ![kits]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 18
 
 
 Замечания: ± На сайте с 13.04.2015
 
 
 Статус: 
 Offline
 
 | Сдвиг 1 влево на число в переменной counter, а после побитовое ИЛИ LATA. Производится установка бита указанного в переменой counter. То есть если в ней был 0, установится 0 бит, если 2, установится 2 бит.Цитата vladh (  )  Так вот объясните пожалуйста бестолковому, что означает строка LATA = LATA or 1 << counter
 
 Аналогично предыдущему. Сдвиг влево, инвертирование и побитовое И. Биты сбрасываются.Цитата vladh (  )  и строка LATA = LATA and not(1 << counter) ? |  
 |  |  |  | 
| 
 
 
 
 | ivan_fd | Дата: Пт, 19.07.2019, 15:51  |                                                                                                                Сообщение # 3 |  
 |   
 
 
 
 
  Группа:
  Модераторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 891
 
 
 Замечания: ± На сайте с 12.01.2009
 
 
 Статус: 
 Offline
 
 | Цитата vladh (  )  На мой взгляд он написан в стиле СИ.
 Если точнее, то в стиле VisualBasic.
 И в Протоне код выглядел бы, почти так же.
 
 
 Код For counter = 0 to 7LATA = 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 |  
 | ![vladh]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 258
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 
 
 
  Группа:
  Модераторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 891
 
 
 Замечания: ± На сайте с 12.01.2009
 
 
 Статус: 
 Offline
 
 | Цитата vladh (  )  Согласно правилам математики выполняются операции выполняются слева направо. Этот порядок нарушается если имеются выражения в скобках или операции умножения/деления. Т.е. Во втором цикле как бы все становится на  места описанные вами(там присутствуют скобки). А вот в первом почему не так?
 Тут немного не так как в математике. Каждый оператор имеет свой приоритет.
 В первом случаи, логический сдвиг имеет выше приоритет, чем логическое ИЛИ, поэтому скобки не нужны.
 Хотя поставить их не помешает, логичнее програма читается. Кстати в Протоне скобки нужны, иначе считает не верно.
 Во втором:
 
 Цитата vladh (  )  LATA = LATA and not(1 << counter)нужны скобки, поскольку логическое НЕ и побитовое НЕ имеет выше приоритет, чем операция сдвига. Поэтому, если не поставить скобки, логическое не применится к 1-це, а не ко всему сдвигу.
 
 
 Цитата vladh (  )  Спасибо, Иван. Но вот сейчас я обратил внимание на одну вещь. Я попробовал Ваш код засунуть в Протон. Действительно почти все прошло без ругательств(кроме DelayMs(1000)). Но я никогда в своих программах не использовал ни символа "|", ни символа "&" и т.п. Я всегда писал "Or" и "And". Но вот сейчас я попробовал в Вашем коде заменить "|" на "Or" и тогда компилятор выдал ошибки. Что это значит, как Вы думаете?
 Вот из помощи ПРОТОНА:
 
 
 Цитата  Logical operatorsBitwise 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 |  
 | ![vladh]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 258
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 
 
 
  Группа:
  Модераторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 891
 
 
 Замечания: ± На сайте с 12.01.2009
 
 
 Статус: 
 Offline
 
 | Потому, что в Протоне такой синтаксис. В МикроБейсике другой. В C, например, так же как и в Протоне. Не OR, а |.
 |  
 |  |  |  | 
| 
 
 
 
 | vladh | Дата: Сб, 20.07.2019, 18:29  |                                                                                                                Сообщение # 8 |  
 | ![vladh]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 258
 
 
 Замечания: ± На сайте с 15.10.2007
 
 
 Статус: 
 Offline
 
 | Цитата ivan_fd (  )  Потому, что в Протоне такой синтаксис. В МикроБейсике другой. В C, например, так же как и в Протоне.Не OR, а |.
 Иван, Вы наверное меня не поняли(или я чего то понять не могу). Я обычно в своих программах на Протоне использую логический оператор Or и никогда "|". Например кусок кода моей программы:
 
 
 Цитата  RepeatGoSub 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 |  
 | ![kits]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 18
 
 
 Замечания: ± На сайте с 13.04.2015
 
 
 Статус: 
 Offline
 
 | В многих бейсиках Or это логический, а | битовый оператор. То есть первый используется как в вашем примере с Until, а второй для установки битов.
 |  
 |  |  |  | 
| 
 
 
 
 | ivan_fd | Дата: Сб, 20.07.2019, 20:24  |                                                                                                                Сообщение # 10 |  
 |   
 
 
 
 
  Группа:
  Модераторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 891
 
 
 Замечания: ± На сайте с 12.01.2009
 
 
 Статус: 
 Offline
 
 | Теперь понял, что Вы имели ввиду. Вам выше уже ответили. Можете, так же посмотреть файл помощи:
 Boolean Logic Operators
 |  
 |  |  |  | 
| 
 
 
 
 | vladh | Дата: Вс, 21.07.2019, 08:29  |                                                                                                                Сообщение # 11 |  
 | ![vladh]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 258
 
 
 Замечания: ± На сайте с 15.10.2007
 
 
 Статус: 
 Offline
 
 | kits и ivan_fd, большое вам спасибо. Очередной раз заглянув в Help обратил внимание, что Or и | это разные операторы. Они относятся к разным группам и выполняют разные функции. А это значит, что механическая их замена будет неправильным действием! И еще. Я до этого никогда не задумывался над тем, что у логических операторов также присутствует разделение по старшинству. Иван правильно обратил внимание, что желательно всегда ставить скобки дабы не было путаницы. 
 Сообщение отредактировал 
 
 vladh - Вс, 21.07.2019, 08:37
 
  |  
 |  |  |  | 
| 
 
 
 
 | kits | Дата: Вс, 21.07.2019, 13:27  |                                                                                                                Сообщение # 12 |  
 | ![kits]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 18
 
 
 Замечания: ± На сайте с 13.04.2015
 
 
 Статус: 
 Offline
 
 | Посмотрите справку на интересующий бейсик. Должна быть таблица похожая на эту (это разновидность бейсика для компа).Цитата vladh (  )  Я до этого никогда не задумывался над тем, что у логических операторов также присутствует разделение по старшинству.
 
   
 Сообщение отредактировал 
 
 kits - Вс, 21.07.2019, 13:28
 
  |  
 |  |  |  | 
| 
 
 
 
 | vladh | Дата: Пн, 22.07.2019, 06:42  |                                                                                                                Сообщение # 13 |  
 | ![vladh]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 258
 
 
 Замечания: ± На сайте с 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
 
  |  
 |  |  |  |