[Trick] If-break
От: Vain Россия google.ru
Дата: 13.04.09 19:53
Оценка: -3 :))) :)
Тут недавно пришла в голову мысль выходить из if-else условия по break. Придумалась такая вот реализация:

#define EVALDEF(x) x
#define JOINSTR_(x,y) x##y
#define JOINSTR(x,y) EVALDEF(JOINSTR_)(x,y)

#define if_break(x) int JOINSTR(line_var_,__LINE__)=0; while((++JOINSTR(line_var_,__LINE__))&0x1) if(x)

Использование:
int main()
{
  if_break(0) {
    printf("1\n");
  } else {
    printf("2\n");
  }

  if_break(1) {
    break;
    printf("3\n");
  } else {
    printf("4\n");
  }

  if_break(0) {
    printf("5\n");
  } else {
    printf("6\n");
    if_break(1) {
      printf("7\n");
      break;
      printf("8\n");
    } else {
      printf("9\n");
    }
    printf("10\n");
    break;
    printf("11\n");
  }

  printf("12\n");

  return 0;
}

2
6
7
10
12


Проверял торлько под 2005 студией.
Какие здесь могут быть проблемы?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
if-break trick
Re: А нафига это надо-то?
От: Erop Россия  
Дата: 13.04.09 20:03
Оценка: +3
Здравствуйте, Vain, Вы писали:

V>Какие здесь могут быть проблемы?


Когда поймают будут сильно бить...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: [Trick] If-break
От: Alexey F  
Дата: 13.04.09 20:04
Оценка: 4 (1) :)
Здравствуйте, Vain, Вы писали:

V>Тут недавно пришла в голову мысль выходить из if-else условия по break. Придумалась такая вот реализация:


V>
V>#define EVALDEF(x) x
V>#define JOINSTR_(x,y) x##y
V>#define JOINSTR(x,y) EVALDEF(JOINSTR_)(x,y)

V>#define if_break(x) int JOINSTR(line_var_,__LINE__)=0; while((++JOINSTR(line_var_,__LINE__))&0x1) if(x)
V>


[ ...skip... ]
Хмм, а чем это отличается от:
#define if_break( x ) switch ( 0 ) case 0 : if( x )

?
Результаты, кажется, выдаёт те же:

2
6
7
10
12

Re[2]: [Trick] If-break
От: Vain Россия google.ru
Дата: 13.04.09 21:22
Оценка: :))
Здравствуйте, Alexey F, Вы писали:

V>>Тут недавно пришла в голову мысль выходить из if-else условия по break. Придумалась такая вот реализация:

AF>Хмм, а чем это отличается от:
AF>
#define if_break( x ) switch ( 0 ) case 0 : if( x )

Незнаю, но отсутствие скобок меня настораживает.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: А нафига это надо-то?
От: Vain Россия google.ru
Дата: 13.04.09 21:23
Оценка:
Здравствуйте, Erop, Вы писали:

V>>Какие здесь могут быть проблемы?

E>Когда поймают будут сильно бить...
Дык, интересно, чем плохо это решение.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: А нафига это надо-то?
От: alexeiz  
Дата: 13.04.09 21:45
Оценка: +1
Здравствуйте, Vain, Вы писали:

V>Дык, интересно, чем плохо это решение.


Решение чего? Сформулируй проблему.
Re[3]: [Trick] If-break
От: vadimcher  
Дата: 13.04.09 22:01
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, Alexey F, Вы писали:


V>>>Тут недавно пришла в голову мысль выходить из if-else условия по break. Придумалась такая вот реализация:

AF>>Хмм, а чем это отличается от:
AF>>
V>#define if_break( x ) switch ( 0 ) case 0 : if( x )
V>

V>Незнаю, но отсутствие скобок меня настораживает.

Отсутствие каких скобок? Я вообще не очень понял для чего тебе первых три #define.

А вот зайца кому, зайца-выбегайца?!
Re[3]: А нафига это надо-то?
От: Erop Россия  
Дата: 13.04.09 22:11
Оценка: +1
Здравствуйте, Vain, Вы писали:

V>Дык, интересно, чем плохо это решение.

Большими счетами за мед. услуги и рисками потери трудоспособности...


А если серьёзно (хотя я думаю, что ты стебёшься так своеобразно, если честно), то
1) Вообще эта куча макросов слишком сложная и может как-то не так сработать. Например, если два if_break окажется в одной строке. Скажем потому, что их засунут в какой-то макрос... Или, например, такой код что будет делать:
if( cond1 ) 
    if_break( cond 2 )
        doSamthing();

2) Тому, кто будет это читать будет сильно не понятно что за if_break такой и что там в теле break делает...
3) Как это будет взаимодействовать с отладчиками -- отдельный вопрос...
4) Про эффективность тоже тема интересная...
5) Про подсветку, рефакторинг, редакторы и т. д. тоже
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: [Trick] If-break
От: Alexey F  
Дата: 13.04.09 22:11
Оценка: +1
Здравствуйте, Vain, Вы писали:

V>Незнаю, но отсутствие скобок меня настораживает.

В смысле?
switch и case могут обходится без скобок. "x" упоминается только один раз, вроде, не нужно в дополнительные скобки оборачивать.
Фигурных скобок нет в обоих предложенных вариантах.
Re[4]: [Trick] If-break
От: Erop Россия  
Дата: 13.04.09 22:25
Оценка:
Здравствуйте, vadimcher, Вы писали:

V>Отсутствие каких скобок? Я вообще не очень понял для чего тебе первых три #define.


Он там уникальную переменную заводит...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: А нафига это надо-то?
От: Vain Россия google.ru
Дата: 13.04.09 22:45
Оценка: -2 :)
Здравствуйте, Erop, Вы писали:

V>>Дык, интересно, чем плохо это решение.

E>1) Вообще эта куча макросов слишком сложная и может как-то не так сработать. Например, если два if_break окажется в одной строке. Скажем потому, что их засунут в какой-то макрос... Или, например, такой код что будет делать:
if( cond1 ) 
    if_break( cond 2 )
        doSamthing();

В принципе, должен работать.
E>2) Тому, кто будет это читать будет сильно не понятно что за if_break такой и что там в теле break делает...
Понятно что.
E>3) Как это будет взаимодействовать с отладчиками -- отдельный вопрос...
Как?
E>4) Про эффективность тоже тема интересная...
Расскажите.
E>5) Про подсветку, рефакторинг, редакторы и т. д. тоже
А что с ними?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: А нафига это надо-то?
От: Erop Россия  
Дата: 13.04.09 23:50
Оценка:
Здравствуйте, Vain, Вы писали:

V>
if( cond1 ) 
V>    if_break( cond 2 )
V>        doSamthing();
V>

V>В принципе, должен работать.
В принципе не скомпилируется даже...

E>>2) Тому, кто будет это читать будет сильно не понятно что за if_break такой и что там в теле break делает...

V>Понятно что.
Правда? А откуда ему это станет понятно?

E>>3) Как это будет взаимодействовать с отладчиками -- отдельный вопрос...

V>Как?
Скорее всего плохо. Одни мусорные переменные в окне просмотра текущих переменных чего стоить будут...

E>>4) Про эффективность тоже тема интересная...

V>Расскажите.
Ну там какие-то вычисления, сравнения ненужные. Стек тратится, опять же...

E>>5) Про подсветку, рефакторинг, редакторы и т. д. тоже

V>А что с ними?
Ну не знают они такого слова if_break... Во всяком случае пока ты их не научишь...

НО НА ГЛАВНЫЙ ВОПРОС ТЫ ТАК И НЕ ОТВЕТИЛ!!!

НА КОЙ ЭТО НУЖНО?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: А нафига это надо-то?
От: Vain Россия google.ru
Дата: 14.04.09 00:47
Оценка: -1 :)
Здравствуйте, Erop, Вы писали:

V>>
if( cond1 ) 
V>>    if_break( cond 2 )
V>>        doSamthing();
V>>

V>>В принципе, должен работать.
E>В принципе не скомпилируется даже...
Да согласен, от усталости не заметил.

E>>>2) Тому, кто будет это читать будет сильно не понятно что за if_break такой и что там в теле break делает...

V>>Понятно что.
E>Правда? А откуда ему это станет понятно?
Какая сложность в 3х срочках кода? Или вы боитесь дефайнов как огня — так это другой разговор.

E>>>3) Как это будет взаимодействовать с отладчиками -- отдельный вопрос...

V>>Как?
E>Скорее всего плохо. Одни мусорные переменные в окне просмотра текущих переменных чего стоить будут...
Watch показывает только то что ты хочешь, а не что хочет отладчик.

E>>>4) Про эффективность тоже тема интересная...

V>>Расскажите.
E>Ну там какие-то вычисления, сравнения ненужные. Стек тратится, опять же...
Экономим на спичках? Скажите ещё что производительность в 2 раза упадёт.. бред.

E>>>5) Про подсветку, рефакторинг, редакторы и т. д. тоже

V>>А что с ними?
E>Ну не знают они такого слова if_break... Во всяком случае пока ты их не научишь...
Это не большая проблема.

E>НО НА ГЛАВНЫЙ ВОПРОС ТЫ ТАК И НЕ ОТВЕТИЛ!!!

E>НА КОЙ ЭТО НУЖНО?
А из топика не ясно? Выходить из скопа. Не надо лишних условий писать там где это не нужно, достаточен один бряк и всё. Оччень удобно.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[7]: А лучше читать Дейкстру и писать процедурно... ;)
От: Erop Россия  
Дата: 14.04.09 01:17
Оценка: 3 (2)
Здравствуйте, Vain, Вы писали:

V>Да согласен, от усталости не заметил.

И в случае, когда два if_break попадают в одну строку, например из-за того, что они внутри одного макроса, тоже нехорошо получится...

V>Какая сложность в 3х срочках кода? Или вы боитесь дефайнов как огня — так это другой разговор.

Сложность такая, что при поддержке программист увидит не определение этих твоих безумных макросов, а использование. И начнёт думать, зачем всё так нестандартно сделано. А так, как никаких преимуществ такого поделия не видно, то очень уж задуматься можно...

Сравни читабельность:
if_break( cond1 ) {
    xxx;
    yyy;
    if( is_done() )
        break;
    zzz;
}
и
if( cond1 ) {
    xxx;
    yyy;
    if( is_done() )
        goto on_done;
    zzz;
}
on_done:;

IMHO, это совершенно эквивалентный код, но вторая версия читабельнее...
Если тебе вторая кажется неприемлемой, то и первая должна бы...

V>Watch показывает только то что ты хочешь, а не что хочет отладчик.

Да? Есть много отладчиков и много платформ. Я не знаю о какой именно ты пишешь, но подозреваю, что о MSVC. Там есть такое удобное окошко, которое типа auto locals называется, или как-то похоже. Так вот оно показывает автоматические переменные текущей функции, используемые в исполняемом сейчас куске кода...

V>Экономим на спичках? Скажите ещё что производительность в 2 раза упадёт.. бред.

IMHO, бред усложнять код НИЧЕГО ВЗАМЕН НЕ ПОЛУЧАЯ

V>Это не большая проблема.

Э-э-э? Почему небольшая? Все за удешевление и автоматизацию поддержки бьются, а у тебя небольшая проблема?

E>>НО НА ГЛАВНЫЙ ВОПРОС ТЫ ТАК И НЕ ОТВЕТИЛ!!!

E>>НА КОЙ ЭТО НУЖНО?
V>А из топика не ясно? Выходить из скопа. Не надо лишних условий писать там где это не нужно, достаточен один бряк и всё. Оччень удобно.
Достаточно одного goto и получаешь РОВНО ТУ ЖЕ СЕМАНТИКУ, только без велосипедов...
Кроме того не понятно зачем из скопа так выходить вообще надо, если уж тебе goto не нравится...

Кстати, если уж того, что ты хочешь добиваться, то логичнее так сделать:
#define breakable for( bool is_the_first_time = true; is_the_first_time; is_the_first_time = false )
а ещё логичнее так:
#define breakable switch( 0 ) case 0 :

А использовать так:
breakable {
    XXX;
    YYY;
    if( is_done() )
        break;
    ZZZ;
}
breakable if( cond1 ) {
    XXX;
    YYY;
    if( is_done() )
        break;
    ZZZ;
} else {
    QQQ;
}
breakable try {
    XXX;
    YYY;
    if( is_done() )
        break;
    ZZZ;
} catch (...) {
    SSS;
}

Только всё равно лучше goto использовать для этих целей. Прямее, яснее и без хаккерства.
А ещё лучше читать Дейкстру и писать процедурно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: О сложности... ;)
От: Erop Россия  
Дата: 14.04.09 01:18
Оценка:
Здравствуйте, Vain, Вы писали:

V>Какая сложность в 3х срочках кода?

Ты сам ответил на свой вопрос:
V>Да согласен, от усталости не заметил.

Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: [Trick] If-break
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 14.04.09 02:04
Оценка: +1
Здравствуйте, Vain, Вы писали:

V>Какие здесь могут быть проблемы?


Смысл?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[2]: goto-фобия? ;)
От: Erop Россия  
Дата: 14.04.09 06:51
Оценка: +1 :)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Смысл?


Видимо goto-фобия помноженная на неумение писать нормально...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: [Trick] If-break
От: Sergey Россия  
Дата: 14.04.09 07:30
Оценка: +1
"Vain" <19391@users.rsdn.ru> wrote in message news:3360981@news.rsdn.ru...
> Тут недавно пришла в голову мысль выходить из if-else условия по break. Придумалась такая вот реализация:
>
>
> #define EVALDEF(x) x
> #define JOINSTR_(x,y) x##y
> #define JOINSTR(x,y) EVALDEF(JOINSTR_)(x,y)
> 
> #define if_break(x) int JOINSTR(line_var_,__LINE__)=0; while((++JOINSTR(line_var_,__LINE__))&0x1) if(x)
>


Обычный goto IMHO гораздо надежнее (и читабельнее).
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[8]: А лучше читать Дейкстру и писать процедурно... ;)
От: Vain Россия google.ru
Дата: 14.04.09 08:30
Оценка: -1
Здравствуйте, Erop, Вы писали:

V>>Какая сложность в 3х срочках кода? Или вы боитесь дефайнов как огня — так это другой разговор.

E>Сложность такая, что при поддержке программист увидит не определение этих твоих безумных макросов, а использование. И начнёт думать, зачем всё так нестандартно сделано. А так, как никаких преимуществ такого поделия не видно, то очень уж задуматься можно...

E>Сравни читабельность:
if_break( cond1 ) {
E>    xxx;
E>    yyy;
E>    if( is_done() )
E>        break;
E>    zzz;
E>}
и
if( cond1 ) {
E>    xxx;
E>    yyy;
E>    if( is_done() )
E>        goto on_done;
E>    zzz;
E>}
E>on_done:;


Что ты пытаешься доказать? Что goto лучше break?
Сравни читабельность:
switch(0) {
  case 0:
    xxx;
    yyy;
    if( is_done() )
      break;
    zzz;
}

и
switch(0) {
  case 0:
    xxx;
    yyy;
    if( is_done() )
      goto on_done;
    zzz;
}
on_done:;


E>IMHO, это совершенно эквивалентный код, но вторая версия читабельнее...

Ну ты всё понял.

V>>Watch показывает только то что ты хочешь, а не что хочет отладчик.

E>Да? Есть много отладчиков и много платформ. Я не знаю о какой именно ты пишешь, но подозреваю, что о MSVC. Там есть такое удобное окошко, которое типа auto locals называется, или как-то похоже. Так вот оно показывает автоматические переменные текущей функции, используемые в исполняемом сейчас куске кода...
И что?

V>>Экономим на спичках? Скажите ещё что производительность в 2 раза упадёт.. бред.

E>IMHO, бред усложнять код НИЧЕГО ВЗАМЕН НЕ ПОЛУЧАЯ


V>>Это не большая проблема.

E>Э-э-э? Почему небольшая? Все за удешевление и автоматизацию поддержки бьются, а у тебя небольшая проблема?
Какое удешевление и автоматизация в 3х строчках кода? Ну ты сноб..

E>Только всё равно лучше goto использовать для этих целей. Прямее, яснее и без хаккерства.

E>А ещё лучше читать Дейкстру и писать процедурно...
А ещё лучше не протирать чтаны на форумах.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: [Trick] If-break
От: Ytz https://github.com/mtrempoltsev
Дата: 14.04.09 09:00
Оценка: +1
Если условия так навернуты, что из них аж по брейку выходить надо, то явно пора что-то рефакторить.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.