Re[9]: Happy debugging!
От: Axc  
Дата: 21.09.07 11:16
Оценка: 3 (1) +1
drx>Здравствуйте, Axc, Вы писали:

drx>Ты не мог бы подробнее написать, какой фрагмент кода тебя смутил и почему?


Всего лишь стиль.
Строка "T* const result = q == p ? p : q;" эквивалентна гораздо более простой строке "T* const result = q;" Но для работы кода это не существенно.
Re: Happy debugging!
От: goto Россия  
Дата: 21.09.07 11:20
Оценка:
Здравствуйте, drx, Вы писали:

drx>Здравствуйте!


drx>Только что разговаривали с коллегой о всяких макро-пакостях в C++. Придумали такой вариант:

drx>
drx>// Put this to some secluded nook
drx>template< typename T >
drx>T* B6085443BCE84d0489BD76C74663E951( T* p )
drx>{
drx>    static T* q = p;
drx>    T* const result = q == p ? p : q;
drx>    q = p;
drx>    return result;
drx>}

drx>#define this B6085443BCE84d0489BD76C74663E951( this )
drx>// Happy debugging!
drx>


Садо-мазо?
Re[10]: Happy debugging!
От: drx США  
Дата: 21.09.07 12:00
Оценка:
Здравствуйте, Axc, Вы писали:

drx>>Ты не мог бы подробнее написать, какой фрагмент кода тебя смутил и почему?

Axc>Всего лишь стиль.
Axc>Строка "T* const result = q == p ? p : q;" эквивалентна гораздо более простой строке "T* const result = q;" Но для работы кода это не существенно.

Это не стиль — нафиг такие стили, это я протупил, извини. И упорно не хотел понимать, в чём дело. Позор мне!

Код, который я запостил, сначала был немного более сложным. Но перед тем, как отослать его на rsdn я немного сократил его, решив, что и так будет неплохо. В коде, который я не запостил, это условие имело смысл. После рефакторинга оно превратилось в "q == p ? p : q", а я не распознал, что оно теперь эквивалентно "q", т.к. дальше продолжал думать о нем как об условном выражении.

Надо будет приучить свои глаза при рефакторинге замечать шаблон "q == p ? p : q", чтобы преобразовывать его в "q".

Спасибо, что у тебя хватило терпения объяснить мне ошибку
Re[11]: Happy debugging!
От: Axc  
Дата: 21.09.07 12:17
Оценка:
Здравствуйте, drx, Вы писали:

drx>Это не стиль — нафиг такие стили


Для такой мерзопакости могло быть и стилем
Re[3]: Happy debugging!
От: alexqc Россия
Дата: 21.09.07 12:37
Оценка:
Здравствуйте, drx, Вы писали:

drx>Здравствуйте, Axc, Вы писали:


drx>>> T* const result = q == p ? p : q;

Axc>>Я чего-то не того. result = q?

drx>Нет.

drx>Это выражение компилится так, как будто бы оно выглядело следующим образом:
drx>
drx>T* const result = ((q == p) ? p : q);
drx>


drx>RTFM, вобщем. Боюсь, что придётся копаться в грамматике языка, т.к. AFAIR Страсутруп в своей книге не стал объяснять подобный случай, а сразу отослал к грамматике.


Хорошо, перепишем:


T* const result;
if(q==p) result=p;
else result=q;




drx>Ну или просто попробуй скомпилировать и запустить

drx>
drx>int i = 0 == 1 ? 2 : 3;
drx>std::cout << i;
drx>


Обманываете, батенька!
Если быть до конца честным, должно быть:

//считаем что p=2

//случай q=2
int i = 2 == 2 ? 2 : 2;
std::cout << i;

//случай q=3
int j = 3==2? 2 : 3;
std::cout << j;


В обоих случаях выведет "значение q" (2 когда q=p=2, 3 когда q=3).
И зачем огород городить?
Живи, Україно, прекрасна і сильна
Re: Happy debugging!
От: Kore Sar  
Дата: 21.09.07 12:41
Оценка:
Еле догнал. Но смешно. Спасибо за позитифф.
Re[2]: UPD: чуть более злостный вариант
От: frogkiller Россия  
Дата: 21.09.07 12:58
Оценка: :)
Здравствуйте, drx, Вы писали:

drx>Проблема приведённого мной варианта в том, что дебаггер вполне может зайти в темплейт, и тогда правда быстро вылезет наружу.

drx>Приведённый ниже вариант лишён этого недостатка:
drx>
drx>#define this (this && __LINE__ % 10 == 1 ? this + 1 : this)
drx>


drx>P.S.: Всё-таки утром лучше думается


это мне напоминает старый баян:
#define true (rand() % 123)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[5]: ????????????
От: VMin Россия  
Дата: 21.09.07 14:31
Оценка:
Здравствуйте, anonim_44ax, Вы писали:

I>>>>Если охото напакастить, то можно гораздо более изощерено придумать.

_>>>Ну так придумайте.

VM>>Так ведь сказал же уже "Неохота..."

_>Значицца понты кидаем, батенька.


Я понимаю русский и английский.
По фене не ботаю.














.
Это я Вас как математик математика спрашиваю:
Что такое математика?
Один из законов Божьих или это сам Бог и есть? (ХХ век)

По-моему Математика — это Слово Божие. (22.03.05)
Re[4]: Happy debugging!
От: drx США  
Дата: 21.09.07 18:25
Оценка:
Здравствуйте, alexqc, Вы писали:

A>...

Извини, что снова отвечаю ссылкой, но я уже ответил на это немногим ранее здесь
Автор: drx
Дата: 21.09.07
.
Re[3]: UPD: чуть более злостный вариант
От: drx США  
Дата: 21.09.07 18:50
Оценка:
Здравствуйте, frogkiller, Вы писали:

F> это мне напоминает старый баян:

F>#define true (rand() % 123)

Да, тоже весёло

Кстати, в голову пришёл вариант, противоположный твоему:
#define rand() (rand(), 4)


(Навеяно вот этим
Автор: Jax
Дата: 22.08.07
)
Re[2]: Happy debugging!
От: drx США  
Дата: 21.09.07 19:14
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>забавно, но это помоему быстро обнаруживаемый жучок,

S>а вот скажем такой
S>
S>T* B6085443BCE84d0489BD76C74663E951( T* p )
S>{
S>static T* q = p;
S>return q;
S>}
S>#define this B6085443BCE84d0489BD76C74663E951( this )
S>

S>имел бы шансы дожить до заказчика

IMHO, всё зависит от контекста — в насколько "глобальный" хидер ты его запихнёшь и вообще, как повезёт. Например, при вставке исходного варианта в precompiled header проекта до всех инклудов, моя прога не смогла даже стартануть — сразу вылетела. Вставил после инклудов и наблюдал забавный эффект: до поры до времени всё работает нормально, но как только на экране появляются pop-up меню, которые, в свою очередь, создаются с помощью visitor'ов, возникает ощущение, что у тебя плавно едет крыша — всё перепутано (следствие надругательства над строками вида visitor.accept( *this )).
Вобщем, всё равно придётся поработать над подбором хорошего места или подходящего класса (воспользоваться перегрузкой) в конкретном проекте.
Re[12]: Happy debugging!
От: drx США  
Дата: 21.09.07 19:41
Оценка: :)
Андрей, наверное, я был не одинок в своём ходе мыслей, т.к. минусы на твой пост про бессмысленность условного выражения до сих пор продолжают ставить
Re: Happy debugging!
От: Eugeny__ Украина  
Дата: 30.09.07 20:03
Оценка:
Здравствуйте, drx, Вы писали:

drx>Здравствуйте!


drx>Только что разговаривали с коллегой о всяких макро-пакостях в C++. Придумали такой вариант:

drx>
drx>// Put this to some secluded nook
drx>template< typename T >
drx>T* B6085443BCE84d0489BD76C74663E951( T* p )
drx>{
drx>    static T* q = p;
drx>    T* const result = q == p ? p : q;
drx>    q = p;
drx>    return result;
drx>}

drx>#define this B6085443BCE84d0489BD76C74663E951( this )
drx>// Happy debugging!
drx>


Гораздо пакостнее было бы возвращать предыдущую ссылку не всегда, а, скажем, с вероятностью 1%. Но это жестоко.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.