[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
Если условия так навернуты, что из них аж по брейку выходить надо, то явно пора что-то рефакторить.
Re[2]: [Trick] If-break
От: Vain Россия google.ru
Дата: 14.04.09 09:33
Оценка: :)
Здравствуйте, Ytz, Вы писали:

Ytz>Если условия так навернуты, что из них аж по брейку выходить надо, то явно пора что-то рефакторить.

Условие — это лишь форма использования. Можно и сократить для наглядности:
//Breakable scope.
{
  //blabla
  break;
  //blabla
}
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[9]: А лучше читать Дейкстру и писать процедурно... ;)
От: Erop Россия  
Дата: 14.04.09 09:35
Оценка:
Здравствуйте, Vain, Вы писали:

V>Что ты пытаешься доказать? Что goto лучше break?

Нет, то, что стандартные средства известнее, и следовательно читабельнее велосипедов...

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

V>Ну ты всё понял.
А вот ты нет. Это ты пришёл спросить что не так в твоём коде. Тебе дофига уже сказали чего там не так. Пора начинать говорить "спасибо за критику", а не хамить и борзеть...

V>И что?

И неудобно. При этом это только один косяк с отладчиком, который пришёл мне в голову сразу. Уверен, что при использовании найдутся ещё...

V>Какое удешевление и автоматизация в 3х строчках кода? Ну ты сноб..

Про хамить -- смотри выше. А удешевление и автоматизация не в твоих макросах (там, кстати, у тебя минимум 4 строчки выходит) а в коде, в котором вместо if будет использоваться if_break... В смысле с if_break будет увеличение ручной работы и удорожание...

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

E>>А ещё лучше читать Дейкстру и писать процедурно...
V>А ещё лучше не протирать чтаны на форумах.
Ну дык и не протирай
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: [Trick] If-break
От: Erop Россия  
Дата: 14.04.09 09:48
Оценка:
Здравствуйте, Vain, Вы писали:

V>Условие — это лишь форма использования. Можно и сократить для наглядности:

V>
V>//Breakable scope.
V>{
V>  //blabla
V>  break;
V>  //blabla
V>}
V>

Зачем тогда вообще писать второе блабла?

Может быть ты приведёшь кусок настоящего кода, где этот твой if_break реально хорош?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: [Trick] If-break
От: Vain Россия google.ru
Дата: 14.04.09 09:55
Оценка:
Здравствуйте, Erop, Вы писали:

V>>Условие — это лишь форма использования. Можно и сократить для наглядности:

E>Зачем тогда вообще писать второе блабла?
E>Может быть ты приведёшь кусок настоящего кода, где этот твой if_break реально хорош?..
Чтобы ты всё опять свёл к goto и все будут счастливы?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: [Trick] If-break
От: Erop Россия  
Дата: 14.04.09 10:12
Оценка:
Здравствуйте, Vain, Вы писали:

V>Чтобы ты всё опять свёл к goto и все будут счастливы?

1) Почему я? Тебе тут разные люди про goto уже пишут...
Ты правда не понимаешь, что твой хаккерский break -- это тоже самое, что goto, только хуже?

2) А пример нужен для того, чтобы понять ЗАЧЕМ ТЕБЕ ЭТО ПОНАДОБИЛОСЬ. Всем как-то не нужно, а тебе нужно. Интересно же зачем...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Про break и goto
От: Alexander G Украина  
Дата: 14.04.09 10:22
Оценка: +1
Действительно ли break всегда, когда уместен, лучше goto ?
while (GetMessage(&msg, NULL, 0, 0))
{
  if (NULL == msg.hwnd)
  {
    switch(msg.message)
    {
      case WM_USER:
        break;
    }
  }
  else
  {
    DispatchMessage(&msg);
  }
}
Русский военный корабль идёт ко дну!
Re[10]: А лучше читать Дейкстру и писать процедурно... ;)
От: Vain Россия google.ru
Дата: 14.04.09 12:28
Оценка:
Здравствуйте, Erop, Вы писали:

V>>Что ты пытаешься доказать? Что goto лучше break?

E>Нет, то, что стандартные средства известнее, и следовательно читабельнее велосипедов...
Чем тебе велосипед Alex F не нравиться?

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

V>>Ну ты всё понял.
E>А вот ты нет. Это ты пришёл спросить что не так в твоём коде. Тебе дофига уже сказали чего там не так. Пора начинать говорить "спасибо за критику", а не хамить и борзеть...
Речь идёт уже про break vs. goto, а не про мой велосипед! И ни кто не борзеет.

V>>И что?

E>И неудобно. При этом это только один косяк с отладчиком, который пришёл мне в голову сразу. Уверен, что при использовании найдутся ещё...
V>>Какое удешевление и автоматизация в 3х строчках кода? Ну ты сноб..
E>Про хамить -- смотри выше. А удешевление и автоматизация не в твоих макросах (там, кстати, у тебя минимум 4 строчки выходит) а в коде, в котором вместо if будет использоваться if_break... В смысле с if_break будет увеличение ручной работы и удорожание...
бред.

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

E>>>А ещё лучше читать Дейкстру и писать процедурно...
V>>А ещё лучше не протирать чтаны на форумах.
E>Ну дык и не протирай
Кто бы говорил..
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[6]: [Trick] If-break
От: Vain Россия google.ru
Дата: 14.04.09 12:30
Оценка: -2
Здравствуйте, Erop, Вы писали:

V>>Чтобы ты всё опять свёл к goto и все будут счастливы?

E>1) Почему я? Тебе тут разные люди про goto уже пишут...
E>Ты правда не понимаешь, что твой хаккерский break -- это тоже самое, что goto, только хуже?
нет.
E>2) А пример нужен для того, чтобы понять ЗАЧЕМ ТЕБЕ ЭТО ПОНАДОБИЛОСЬ. Всем как-то не нужно, а тебе нужно. Интересно же зачем...
будет надо, найдешь пример.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: Про break и goto
От: Vain Россия google.ru
Дата: 14.04.09 12:35
Оценка: :)
Здравствуйте, Alexander G, Вы писали:

AG>Действительно ли break всегда, когда уместен, лучше goto ?

AG>
AG>while (GetMessage(&msg, NULL, 0, 0))
AG>{
AG>  if (NULL == msg.hwnd)
AG>  {
AG>    switch(msg.message)
AG>    {
AG>      case WM_USER:
AG>        break;
AG>    }
AG>  }
AG>  else
AG>  {
AG>    DispatchMessage(&msg);
AG>  }
AG>}
AG>

Почему все сводят мою идею к goto? Я не понимаю, я поставил вопрос break vs. goto? Речь идёт про выход из одного скопа, что не так-то с примером Alex F?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: [Trick] If-break
От: Roman Odaisky Украина  
Дата: 14.04.09 13:24
Оценка:
Зачем так сложно?

#define BREAKABLE_SCOPE if(int _stop = 0); else while(!_stop++)

BREAKABLE_SCOPE if(condition)
{
    if(something)
    {
        break;
    }
}

даже можно еще хуже:

define using(DECL) if(bool _stop = false); else for(DECL; !_stop; stop = true)

using(std::unique_ptr<X> x(new X))
{
    . . .
}

Вот кто бы (с помощью метапрограммирования?) сделал break для именованных циклов...
До последнего не верил в пирамиду Лебедева.
Re[11]: А лучше читать Дейкстру и писать процедурно... ;)
От: Erop Россия  
Дата: 14.04.09 13:57
Оценка:
Здравствуйте, Vain, Вы писали:

E>>Нет, то, что стандартные средства известнее, и следовательно читабельнее велосипедов...

V>Чем тебе велосипед Alex F не нравиться?
1) Тем, что велосипед, то есть не понятен без доп. разбирательсв, не поддерживается редакторами, подсветкой, автодополнялками, автоформатилками, отладчиками, тулзами по рефакторингу и т. д.
2) Тем, что позволяет использовать странным способом слово dafault:
3) Тем, что маскирует использование goto, ничего по сути не меняя в коде
4) Возможен конфликт имён. Вдруг у кого-то таки есть где-то идентификатор if_break, или breakable...

V>Речь идёт уже про break vs. goto, а не про мой велосипед! И ни кто не борзеет.

То есть ты признаёшься ещё и в злостном и преднамеренном офтопе?
Если ты хочешь поспорить по воводу что лучше break vs goto, то тебе в КСВ, IMHO...
Правда если формулировка будет примерно такая: "что лучше, основанный на макросах расширенный синтексис С++, или просто goto на метку в конце блока", то скорее всего все скажут, что велосипед ещё хуже
Кстати, в вариенте с goto метке надо дать имя, то есть осмысленное имя, что повышает читабельность...

V>бред.

Никто, говоришь, не борзеет и не хамит?

V>>>А ещё лучше не протирать чтаны на форумах.

E>>Ну дык и не протирай
V>Кто бы говорил..
А с чего ты взял, что я сейчас в штанах?
Короче. По поводу троллинга -- или на три буквы, в смысле в КСВ...
А по существу, читай SUBJ...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Про break и goto
От: Erop Россия  
Дата: 15.04.09 22:10
Оценка:
Здравствуйте, Vain, Вы писали:

V>Почему все сводят мою идею к goto? Я не понимаю, я поставил вопрос break vs. goto? Речь идёт про выход из одного скопа, что не так-то с примером Alex F?


Потому, что ты не можешь внятно объяснить чем оно от goto отличается... Я же не зря прошу тебя привести реальный пример, где это могло бы улучшить код...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Про break и goto
От: мухоморец Украина  
Дата: 16.04.09 09:16
Оценка: 10 (1)
Здравствуйте, Erop, Вы писали:

E>Потому, что ты не можешь внятно объяснить чем оно от goto отличается... Я же не зря прошу тебя привести реальный пример, где это могло бы улучшить код...


честно признаюсь, было пару раз что не хватало break из вложеного if(напр. менялось условие со временем), и при этом менять-рефакторить if было очень лениво, всё так красиво и органично выглядело)))))))))), легче было бы добавить новый if с break )). О goto даже не думал, тем более по break привык искать точку "выхода". Но как подумаю, что через неделю сам с ужасом разбирал бы куда вываливаемся(искал бы по привычке цикл свитч). Было легче(быстрее) мне тогда было на скорую if вывести в отдельную функцию и там добавить if с return, но принцип был бы такой же. Но то всё от лени были такие мысли , потом бы огрёб проблем.
Re: [Trick] If-break
От: Аноним  
Дата: 16.04.09 10:29
Оценка: 1 (1) +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>

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

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

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

V>  printf("12\n");

V>  return 0;
V>}
V>

V>

V>2
V>6
V>7
V>10
V>12


V>Проверял торлько под 2005 студией.

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


do
{
// а тут break;
}while(false);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.