ViKo 1 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба Могу ли я задать вместо (сначала первое, затем второе) if (USART3->SR & USART_SR_RXNE) { if (USART3->DR == 24) { Задать сразу if (USART3->SR & USART_SR_RXNE && USART3->DR == 24) { В этом случае гарантии, что сначала прочитается статус, а потом данные, нет, правильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба В этом случае гарантии, что сначала прочитается статус, а потом данные, нет, правильно? Нет: && всегда обрабатывается слева направо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба И его выполнение прекращается как только получен однозначный результат. Т.е. если USART3->SR & USART_SR_RXNE не равно true, то USART3->DR == 24 проверяться не будет, так как уже не влияет на результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба Нет: && всегда обрабатывается слева направо. То есть, гарантия есть. И могу так писать? Спасибо ответившим, и Кернигану с Ричи! А вот если бы было (a + x) - (c + d)? Там тоже попорядку? Вроде, в книжках, наоборот, обращают внимание, что никакой определенной последовательности нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба А вот не надо хитромудрый код плодить. Написать в явном виде, и точка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба А вот не надо хитромудрый код плодить. Написать в явном виде, и точка. Это который? Мне второй вариант симпатичнее, меньше скобок в конце. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба То есть, гарантия есть. И могу так писать? Спасибо ответившим, и Кернигану с Ричи! А вот если бы было (a + x) - (c + d)? Там тоже попорядку? Вроде, в книжках, наоборот, обращают внимание, что никакой определенной последовательности нет. Сначала скобочки, а потом разность Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба Сначала скобочки, а потом разность Вопрос, какие скобочки сначала, а какие потом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба Вопрос, какие скобочки сначала, а какие потом. А вот тут никаких гарантий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба Для полного просветления: а если я возьму проверку DR в скобки, во втором варианте? Все равно пойдет слева направо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба Вопрос, какие скобочки сначала, а какие потом. (a + x) - (c + d) переменные все разные => всё равно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба Для полного просветления: а если я возьму проверку DR в скобки, во втором варианте? Все равно пойдет слева направо? Все равно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба (a + x) - (c + d) переменные все разные => всё равно Представьте, что эти переменные обновляются в прерывании. Или это содержимое таймеров. Портов. Volatile. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба ну какая разница? если у вас значение может смениться в любой момент, сначала сделайте не меняемую копию, а потом вычисляйте. Потому что, что вам даст в какой последовательности будут выполняться скобки, если при любой последовательности у вас будут любые данные на входе?... Вот если запрос первых данных, как то меняет вторые, то тогда надо написать в явном виде что за чем и не придумывать. Потому что мировой запас скобок, строчек, пробелов и переносов строки в целом не ограничен! Я бы даже вот так 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба Для операторов && и || порядок вычисления операндов четко определен. Для остальных операторов - нет. Поэтому если в выражении с другими операторами более одной volatile-перменной, то многие компиляторы выдадут предупреждение о неопределенном порядке вычисления подвыражений. Дальше программист волен сам решать - положиться на случай или разбить выражение на несколько с явным порядком вычисления. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться