Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F207
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ViKo
Могу ли я задать вместо (сначала первое, затем второе)
if (USART3->SR & USART_SR_RXNE) {
if (USART3->DR == 24) {
Задать сразу
if (USART3->SR & USART_SR_RXNE && USART3->DR == 24) {
В этом случае гарантии, что сначала прочитается статус, а потом данные, нет, правильно?
aaarrr
Цитата(ViKo @ Mar 3 2015, 16:31) *
В этом случае гарантии, что сначала прочитается статус, а потом данные, нет, правильно?

Нет: && всегда обрабатывается слева направо.
Сергей Борщ
И его выполнение прекращается как только получен однозначный результат. Т.е. если USART3->SR & USART_SR_RXNE не равно true, то USART3->DR == 24 проверяться не будет, так как уже не влияет на результат.
ViKo
Цитата(aaarrr @ Mar 3 2015, 16:45) *
Нет: && всегда обрабатывается слева направо.

То есть, гарантия есть. И могу так писать? Спасибо ответившим, и Кернигану с Ричи!
А вот если бы было (a + x) - (c + d)? Там тоже попорядку? Вроде, в книжках, наоборот, обращают внимание, что никакой определенной последовательности нет.
scifi
А вот не надо хитромудрый код плодить.
Написать в явном виде, и точка.
ViKo
Цитата(scifi @ Mar 3 2015, 17:05) *
А вот не надо хитромудрый код плодить.
Написать в явном виде, и точка.

Это который? Мне второй вариант симпатичнее, меньше скобок в конце.
Obam
Цитата(ViKo @ Mar 3 2015, 18:00) *
То есть, гарантия есть. И могу так писать? Спасибо ответившим, и Кернигану с Ричи!
А вот если бы было (a + x) - (c + d)? Там тоже попорядку? Вроде, в книжках, наоборот, обращают внимание, что никакой определенной последовательности нет.


Сначала скобочки, а потом разность
ViKo
Цитата(Obam @ Mar 3 2015, 17:18) *
Сначала скобочки, а потом разность

Вопрос, какие скобочки сначала, а какие потом.
aaarrr
Цитата(ViKo @ Mar 3 2015, 17:28) *
Вопрос, какие скобочки сначала, а какие потом.

А вот тут никаких гарантий.
ViKo
Для полного просветления: а если я возьму проверку DR в скобки, во втором варианте? Все равно пойдет слева направо?
Obam
Цитата(ViKo @ Mar 3 2015, 18:28) *
Вопрос, какие скобочки сначала, а какие потом.


(a + x) - (c + d) переменные все разные => всё равно
aaarrr
Цитата(ViKo @ Mar 3 2015, 17:42) *
Для полного просветления: а если я возьму проверку DR в скобки, во втором варианте? Все равно пойдет слева направо?

Все равно.
ViKo
Цитата(Obam @ Mar 3 2015, 17:53) *
(a + x) - (c + d) переменные все разные => всё равно

Представьте, что эти переменные обновляются в прерывании. Или это содержимое таймеров. Портов. Volatile.
Golikov A.
ну какая разница?
если у вас значение может смениться в любой момент, сначала сделайте не меняемую копию, а потом вычисляйте.

Потому что, что вам даст в какой последовательности будут выполняться скобки, если при любой последовательности у вас будут любые данные на входе?...

Вот если запрос первых данных, как то меняет вторые, то тогда надо написать в явном виде что за чем и не придумывать.


Потому что мировой запас скобок, строчек, пробелов и переносов строки в целом не ограничен!

Я бы даже вот так
if (USART3->SR & USART_SR_RXNE && USART3->DR == 24)
не написал, потому что читать неудобно,
вот так лучше
if ((USART3->SR & USART_SR_RXNE) && (USART3->DR == 24))
а еще лучше вот так
if (
((USART3->SR & USART_SR_RXNE) != 0) && //проверяем то-то
(USART3->DR == 24) //проверяем сё-то
)

явно указанные условия и коменты повышают читаемость, ИМХО. Опять же написание явных условий еще раз заставляет их обдумать и уменьшает число ошибок вынесенных на тесты.

проверяем что флаг приемник не пуст - стоит - тут явно надо != 0
проверяем что флаг фифо переполнено - нет - тут надо == 0
Сергей Борщ
Для операторов && и || порядок вычисления операндов четко определен. Для остальных операторов - нет. Поэтому если в выражении с другими операторами более одной volatile-перменной, то многие компиляторы выдадут предупреждение о неопределенном порядке вычисления подвыражений. Дальше программист волен сам решать - положиться на случай или разбить выражение на несколько с явным порядком вычисления.
scifi
Цитата(ViKo @ Mar 3 2015, 17:07) *
Это который? Мне второй вариант симпатичнее, меньше скобок в конце.

Аплодирую вашей эрудированности.

Цитата(ViKo @ Mar 3 2015, 17:28) *
Вопрос, какие скобочки сначала, а какие потом.

А, нет, поспешил. Аплодирую вашей самонадеянности biggrin.gif
ViKo
scifi, я прочитал 2 книги по С, КиР и Шилдта. Ни там, ни там я не видел описанного свойства && ||. К чему ваш сарказм? Вы тоже не с рождения обзавелись эрудицией. Вот я задал вопрос, получил ответы, поблагодарил. Обогатился знаниями.

Для Golikov A.
Как минималист, предпочитаю краткость, настолько, насколько это допустимо. Мне так проще. Комментариев к очевидным местам не пишу. У меня перед этим блоком есть пара строк комментариев, где описаны условия. Но не в виде "если флаг не равен нулю", а "если принято сообщение".
Golikov A.
хорошо вам минималистам.

в каком то из контрактов у меня было требования - коменты к каждой строке...

Код
int i = 0; //параметр цикла

//пустая переменная для вычитывания FIFO UART
int dummy = dummy; //инициализируем ей-же чтобы не было варнинга


и так далее... после 3-4 лет, так и пишу коменты по привычке почти к каждой строчке... Пару раз мне помогали, но гораздо больше помогают тем кто будет поддерживать после вас.

а минимализм.... я даже не люблю
temp = cond ? 1 : 0;
а теперь еще лямда функций понаделали...
VAI
Цитата(ViKo @ Mar 3 2015, 23:58) *
scifi, я прочитал 2 книги по С, КиР и Шилдта. Ни там, ни там я не видел описанного свойства && ||.


Не занудства ради, а пользы для:
Керниган и Ричи
2.12. Старшинство и порядок вычисления
ViKo
Цитата(VAI @ Mar 4 2015, 07:58) *
Не занудства ради, а пользы для:
Керниган и Ричи
2.12. Старшинство и порядок вычисления

Там только упоминается в скобках "Исключением являются &&, ||, ?: и ','."
А для пользы в разделе 2.6 описано с примерами то, что нужно. Да, пролетело было мимо, а теперь внедрено в моск. rolleyes.gif
А у Шилдта на этот счет - ничего.

Цитата(Golikov A. @ Mar 4 2015, 00:49) *
а минимализм.... я даже не люблю
temp = cond ? 1 : 0;

А я тащусь... biggrin.gif
Код
#define WDELAY_START(US);                        \
  TIM7->PSC = ((US < 65536) ? (60 - 1) :                \
          ((US < 655360) ? (600 - 1) :                 \
          ((US < 6553600) ? (6000 - 1) : (60000 - 1))));        \
  TIM7->ARR = ((US < 65536) ? (US - 1) :                \
          ((US < 655360) ? (US / 10 - 1) :                \
          ((US < 6553600) ? (US / 100 - 1) : (US / 1000 - 1))));    \
  TIM7->EGR = TIM_EGR_UG;                        \
  TIM7->SR = 0;                                \
  TIM7->CR1 |= TIM_CR1_CEN;
scifi
Цитата(ViKo @ Mar 3 2015, 22:58) *
scifi, я прочитал 2 книги по С, КиР и Шилдта. Ни там, ни там я не видел описанного свойства && ||. К чему ваш сарказм?

Вот об этом и речь. Не надо писать код, для понимания которого программисту нужно лезть в справочники. Я, к примеру, не помню всю таблицу приоритетов операторов, поэтому ставлю скобки, когда есть сомнения, и другим советую.

Цитата(ViKo @ Mar 3 2015, 22:58) *
Вы тоже не с рождения обзавелись эрудицией. Вот я задал вопрос, получил ответы, поблагодарил. Обогатился знаниями.

Вообще-то последней инстанцией по этим вопросам является даже не форум, а стандарт языка.
Цитата
Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares equal to 0, the second operand is not evaluated.

Оч. рекомендую туда заглядывать.
ViKo
Цитата(scifi @ Mar 4 2015, 09:49) *
Вот об этом и речь. Не надо писать код, для понимания которого программисту нужно лезть в справочники. Я, к примеру, не помню всю таблицу приоритетов операторов, поэтому ставлю скобки, когда есть сомнения, и другим советую.

На это я пойти не могу. Я периодически заглядываю в таблицу приоритетов, но лишних скобок не ставлю. Это противоречит моим принципам.
Цитата
Вообще-то последней инстанцией по этим вопросам является даже не форум, а стандарт языка.
Оч. рекомендую туда заглядывать.

Это да. Правда, там труднее копаться. Но надо.
scifi
Цитата(ViKo @ Mar 4 2015, 10:01) *
На это я пойти не могу. Я периодически заглядываю в таблицу приоритетов, но лишних скобок не ставлю. Это противоречит моим принципам.

Тогда вам сюда. Уверен, сможете выступить очень достойно biggrin.gif

Цитата(ViKo @ Mar 4 2015, 10:01) *
Это да. Правда, там труднее копаться. Но надо.

А я привык. На любой вопрос нахожу ответ за 5 минут максимум.
Сергей Борщ
Цитата(scifi @ Mar 4 2015, 08:49) *
Не надо писать код, для понимания которого программисту нужно лезть в справочники.
"Создайте программу, которой может пользоваться дурак, и только дурак захочет ей пользоваться".

Гордое звание "программист" подразумевает наличие некоторых базовых знаний. Поведение операторов языка и правила неявных приведений типов входят в эти базовые знания. Добавление в исходник излишеств вроде ==0, (a * b ) + c, комментариев к очевидным действиям только отвлекает и затрудняет понимание алгоритма.
WHALE
Цитата(Сергей Борщ @ Mar 4 2015, 12:03) *
"Создайте программу, которой может пользоваться дурак, и только дурак захочет ей пользоваться".

Гордое звание "программист" подразумевает наличие некоторых базовых знаний. Поведение операторов языка и правила неявных приведений типов входят в эти базовые знания. Добавление в исходник излишеств вроде ==0, (a * b ) + c, комментариев к очевидным действиям только отвлекает и затрудняет понимание алгоритма.

Как раз сейчас читаю Макконелл"Совершенный код" и он с вами не согласен насчет излишеств.
AHTOXA
Цитата(WHALE @ Mar 4 2015, 13:31) *
Как раз сейчас читаю Макконелл"Совершенный код" и он с вами не согласен насчет излишеств.

Я не читал эту книгу, но судя по здешним отзывам о ней, она мне уже не нравится sm.gif
Golikov A.
Да пустое все...

если что-то лишне разжевано - это можно не читать

если чего-то не хватает, то это надо допридумывать.

Первое просто, второе сложнее... Так что энергетически выгоднее код с излишком коментов, чем с недостатком...

Скобки, структура текста и коменты, позволяет отобразить не только суть конкретной конструкции, но и ход мысли, структуру архитектуры... но это дело каждого...


kostyan
Красиво структурированный читаемый код, и "только дурак" - имхо несовместимые понятия. Особенно для проектов, в которых трудятся программистов в количестве больше одного.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.