Цитата(Сергей Борщ @ Oct 21 2008, 22:38)

ReAl объяснил это мутностью стандарта в этой части. Самому искать было лень.
Ой, не помню... Кажется, разночтение было на тему - обязательно ли в цепочке
Код
int a;
volatile int v;
a = v = 0;
для записи в
a зачитывать из
v. Согласно стандарту значением присваивающего выражения есть значение, которое будет записано в левую часть после присваивания.
Я утверждал, что в случае volatile-переменной значение неизвестно и нужно перезачитать.
Но какой-то компилятор радостно в таком случае явно писал нули во все переменные, что на мой взгляд неправильно. В каком-то обсуждении (RU.C-CPP или ещё где-то) было сказано, что смысл строки стандарта не "что там будет сидеть после записи", а "что туда будет записано", а это не зависит от volatile-ности. Я не стал разбираться дальше, "юридический английский" у меня не настолько... :-(
Впрочем, поскольку я всё равно был уверен, что надо перезачитывать, я всё равно не использовал значение присваивающего выражения, если в левой части volatile, так как это снижает читаемость - глаз воспринимает как значение правую часть, а реально будет прочитанное из левой.
т.е. не использовал while( (volatile_var = var) ), function( volatile_var = var), return (volatile_var = var);
Однако считаю, что в случае отдельно стоящей volatile-переменной в духе
Код
UDR;
компилятор должен провести все действия, необходимые для вычисления выражения (в данном случае только прочесть переменую, в случае с UDR+1; - прочесть и прибавить единицу), а только потом обнаружить, что результат-то никому не нужен и начать оптимизатором "отматывать" назад ненужные действия -
пока не упрётся в запрет, поставленный квалификатором volatile. Т.е. чтение volatile-переменной должно остаться. Если какой-то компилятор этого не делает (это тоже, кажется, где-то в аське обсуждалось), то надо внимательно ещё раз прочесть стандарт и попытаться поругаться.
Цитата(sergeeff @ Oct 21 2008, 19:01)

Без финтов - это отлично, но!!! - очень непривычно. Чтение из переменной очевидно, когда оно стоит справа от знака присваивания. И когда этот знак опущен это и вызывает недоумение и неприятие.
А многие не понимают указателей.
А у многих вызывает недоумение запись
Код
value = ( flag ? sin : cos)(x);
несмотря на то, что она, на мой взгялд, гораздо более читабельна, чем алгол-68
Код
value := if flag then sin else cos fi (x)
Если из С повыбрасывать всё то, что вызывает недоумение у новичков, то что останется?
Цитата(sergeeff @ Oct 21 2008, 19:01)

Код
volatile int x;
...
x ? : x;
Прочесть x, если он равен нулю - прочесть его ещё раз. С прочитанными значениями больше ничего не делать.
Цитата(sergeeff @ Oct 21 2008, 19:01)

Коллеге zltigo респект за неординарный подход.
Подход
правильный, называется "знать инструмент, которым пользуешся".
Цитата(scifi @ Oct 21 2008, 19:42)

Итак, итоги:
...
2) Очевидно, что такой код не проходит тест "даже моя бабушка поймёт, что это значит". Другими словами, читаемость кода страдает.
Читаемость кода завиит от подготовки читающего. Так можно дойти и до "отмены" ++ и переходу от ++i к i = i + 1; (во всяком случае побыстрее запретить применение i++, так как это вообще непонятно).
Вменяемый человек, наткнувшись первый раз, при помощи стандарта либо более опытных товарищей разберётся и дальше для него читаемость будет нормальная.
Цитата(Сергей Борщ @ Oct 21 2008, 22:59)

На строку с комментарием предупреждение: Warning[Pe174]: expression has no effect D:\Projects\Req\scmRTOS\Samples\LPC2xxx\1-EventFlag\Src\main.cpp 108
Странно...
Всё-таки странно.
Может всё-же пройтись ещё по стандарту и попробовать с ними поругаться?