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

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

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

А вот не надо хитромудрый код плодить.
Написать в явном виде, и точка.
Это который? Мне второй вариант симпатичнее, меньше скобок в конце.
Цитата(ViKo @ Mar 3 2015, 18:00)

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

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

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

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

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

(a + x) - (c + d) переменные все разные => всё равно
Представьте, что эти переменные обновляются в прерывании. Или это содержимое таймеров. Портов. Volatile.
Golikov A.
Mar 3 2015, 17:44
ну какая разница?
если у вас значение может смениться в любой момент, сначала сделайте не меняемую копию, а потом вычисляйте.
Потому что, что вам даст в какой последовательности будут выполняться скобки, если при любой последовательности у вас будут любые данные на входе?...
Вот если запрос первых данных, как то меняет вторые, то тогда надо написать в явном виде что за чем и не придумывать.
Потому что мировой запас скобок, строчек, пробелов и переносов строки в целом не ограничен!
Я бы даже вот так
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
Сергей Борщ
Mar 3 2015, 19:03
Для операторов && и || порядок вычисления операндов четко определен. Для остальных операторов - нет. Поэтому если в выражении с другими операторами более одной volatile-перменной, то многие компиляторы выдадут предупреждение о неопределенном порядке вычисления подвыражений. Дальше программист волен сам решать - положиться на случай или разбить выражение на несколько с явным порядком вычисления.
Цитата(ViKo @ Mar 3 2015, 17:07)

Это который? Мне второй вариант симпатичнее, меньше скобок в конце.
Аплодирую вашей эрудированности.
Цитата(ViKo @ Mar 3 2015, 17:28)

Вопрос, какие скобочки сначала, а какие потом.
А, нет, поспешил. Аплодирую вашей самонадеянности
scifi, я прочитал 2 книги по С, КиР и Шилдта. Ни там, ни там я не видел описанного свойства && ||. К чему ваш сарказм? Вы тоже не с рождения обзавелись эрудицией. Вот я задал вопрос, получил ответы, поблагодарил. Обогатился знаниями.
Для Golikov A.
Как минималист, предпочитаю краткость, настолько, насколько это допустимо. Мне так проще. Комментариев к очевидным местам не пишу. У меня перед этим блоком есть пара строк комментариев, где описаны условия. Но не в виде "если флаг не равен нулю", а "если принято сообщение".
Golikov A.
Mar 3 2015, 21:49
хорошо вам минималистам.
в каком то из контрактов у меня было требования - коменты к каждой строке...
Код
int i = 0; //параметр цикла
//пустая переменная для вычитывания FIFO UART
int dummy = dummy; //инициализируем ей-же чтобы не было варнинга
и так далее... после 3-4 лет, так и пишу коменты по привычке почти к каждой строчке... Пару раз мне помогали, но гораздо больше помогают тем кто будет поддерживать после вас.
а минимализм.... я даже не люблю
temp = cond ? 1 : 0;
а теперь еще лямда функций понаделали...
Цитата(ViKo @ Mar 3 2015, 23:58)

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

Не занудства ради, а пользы для:
Керниган и Ричи
2.12. Старшинство и порядок вычисления
Там только упоминается в скобках "Исключением являются &&, ||, ?: и ','."
А для пользы в разделе 2.6 описано с примерами то, что нужно. Да, пролетело было мимо, а теперь внедрено в моск.

А у Шилдта на этот счет - ничего.
Цитата(Golikov A. @ Mar 4 2015, 00:49)

а минимализм.... я даже не люблю
temp = cond ? 1 : 0;
А я тащусь...
Код
#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;
Цитата(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.
Оч. рекомендую туда заглядывать.
Цитата(scifi @ Mar 4 2015, 09:49)

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

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

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

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

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

Как раз сейчас читаю Макконелл"Совершенный код" и он с вами не согласен насчет излишеств.
Я не читал эту книгу, но судя по здешним отзывам о ней, она мне уже не нравится
Golikov A.
Mar 4 2015, 11:33
Да пустое все...
если что-то лишне разжевано - это можно не читать
если чего-то не хватает, то это надо допридумывать.
Первое просто, второе сложнее... Так что энергетически выгоднее код с излишком коментов, чем с недостатком...
Скобки, структура текста и коменты, позволяет отобразить не только суть конкретной конструкции, но и ход мысли, структуру архитектуры... но это дело каждого...
kostyan
Mar 4 2015, 11:59
Красиво структурированный читаемый код, и "только дурак" - имхо несовместимые понятия. Особенно для проектов, в которых трудятся программистов в количестве больше одного.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.