Перейти к содержанию
    

Могу ли я задать вместо (сначала первое, затем второе)

if (USART3->SR & USART_SR_RXNE) {

if (USART3->DR == 24) {

Задать сразу

if (USART3->SR & USART_SR_RXNE && USART3->DR == 24) {

В этом случае гарантии, что сначала прочитается статус, а потом данные, нет, правильно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В этом случае гарантии, что сначала прочитается статус, а потом данные, нет, правильно?

Нет: && всегда обрабатывается слева направо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И его выполнение прекращается как только получен однозначный результат. Т.е. если USART3->SR & USART_SR_RXNE не равно true, то USART3->DR == 24 проверяться не будет, так как уже не влияет на результат.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет: && всегда обрабатывается слева направо.

То есть, гарантия есть. И могу так писать? Спасибо ответившим, и Кернигану с Ричи!

А вот если бы было (a + x) - (c + d)? Там тоже попорядку? Вроде, в книжках, наоборот, обращают внимание, что никакой определенной последовательности нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот не надо хитромудрый код плодить.

Написать в явном виде, и точка.

Это который? Мне второй вариант симпатичнее, меньше скобок в конце.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То есть, гарантия есть. И могу так писать? Спасибо ответившим, и Кернигану с Ричи!

А вот если бы было (a + x) - (c + d)? Там тоже попорядку? Вроде, в книжках, наоборот, обращают внимание, что никакой определенной последовательности нет.

 

Сначала скобочки, а потом разность

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сначала скобочки, а потом разность

Вопрос, какие скобочки сначала, а какие потом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для полного просветления: а если я возьму проверку DR в скобки, во втором варианте? Все равно пойдет слева направо?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос, какие скобочки сначала, а какие потом.

 

(a + x) - (c + d) переменные все разные => всё равно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для полного просветления: а если я возьму проверку DR в скобки, во втором варианте? Все равно пойдет слева направо?

Все равно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

(a + x) - (c + d) переменные все разные => всё равно

Представьте, что эти переменные обновляются в прерывании. Или это содержимое таймеров. Портов. Volatile.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну какая разница?

если у вас значение может смениться в любой момент, сначала сделайте не меняемую копию, а потом вычисляйте.

 

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

 

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

 

 

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

 

Я бы даже вот так

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-перменной, то многие компиляторы выдадут предупреждение о неопределенном порядке вычисления подвыражений. Дальше программист волен сам решать - положиться на случай или разбить выражение на несколько с явным порядком вычисления.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...