Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Нетривиально - это "Duff's device". (+)

Отправлено ReAl 19 июля 2009, г. 17:33
В ответ на: Тривиально? Думаю, Вы не правы. Этот примерчик продолжает тему трюков (x) || (f(()), начатую мною неск. недель назад. Что угодно, но это не тривиально (это будет казаться таковым сразу после того, как поймешь). Си - он силен тем, что на основе простых конструкций создавать неожиданные перлы. Специально рассрашивал миэтовского преподавателя. Нет, не тривиально. отправлено пользователем VasilyS 19 июля 2009, г. 16:36

А данный пример вкупе с тоже не всеми сразу понимаемыми
while( *dst++ = *src++) ;
(flag ? func1 : func2)(arg1, arg2);

тривиален, топчется вокруг базового для С понятий выражений и побочных эффектов.
На мой взгляд - понгимание/непонимание этой "пи-вычислялки" лежит не на оси "тривиально-нетривиально", а на оси "понял - не понял основы языка". Собственно,
expr1 && expr2;

мало чем отличается от
while( expr1 && expr2) { }

с точки зрения вычисления выражнеия (expr1 && expr2) и его подвыражений.

Пожалуй, соглашусь, что нетривиальным (в самом языке С, а не в "пи-вычислялке" или других "типа трюках", которые не более трюки, чем приведенное выше копирование строки с упакованными внутрь условия while всеми операциями) есть то, что
a = b;

это не "операция присваивания", а выражение, в котором есть оператор присваивания - "assignment expression". Само присваивание есть побочным эффектом вычисления этого выражения
6.5.16 Assignment operator
...
Semantics
An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment, but is not an lvalue. The type of an assignment expression is the type of the left operand unless the
left operand has qualified type, in which case it is the unqualified version of the type of the left operand.
The side effect of updating the stored value of the left operand shall occur between the previous and the next sequence point.


Вот если понять это в С, то все "трюки (x) || F()" перестают быть *трюками* и становятся естественным результатом вычисления выражений.


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
умножьте 2 на три:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru