LINUX.ORG.RU

Change GCC15

 


0

2

Читаю я статью на opennet: https://www.opennet.ru/opennews/art.shtml?num=63141

И вижу:

Реализованы элементы будущего стандарта C2Y (-std=c2y и -std=gnu2y): 
...
 Поддержка присвоения имён циклам для того, чтобы ссылаться на них в коде.
   outer: for (int i = 0; i < IK; ++ i) {
     switch (i) {
       case 1:
         break;       // jumps to CONT1
       case 2:
         break outer; // jumps to CONT2
     }
     // CONT1
   }
   // CONT2

Не понял. Это что еще за бред?

★★★★★

Это интерпретация заявлений Дейкстры про goto

anonymous
()

Пометка цикла на который действует break, если реально не понял то вот переделал на goto.

   for (int i = 0; i < IK; ++ i) {
     switch (i) {
       case 1:
         break;       // jumps to CONT1
       case 2:
!!!      goto outer; // jumps to CONT2
     }
     // CONT1
    }
    // CONT2
!!! outer:

MOPKOBKA ★★★★★
()

break outer получается тоже самое, что continue? Наверное может быть смысл во вложенных циклах, если правильно понял.

anonymous
()

Но мне вот эта штука понравилась, странно что раньше не было...

if (int i = call(); i > 10) {
  // ...
}
MOPKOBKA ★★★★★
()
Ответ на: комментарий от anonymous

break outer получается тоже самое, что continue?

Нет, continue просто пропускает одну итерацию, это break на произвольный цикл.

MOPKOBKA ★★★★★
()

Это из джавы позаимствовали, там вообще нормальных меток нет, только такие.

firkax ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Тот что нравится и логично, вопросов не возникает, вопросы к странным ново введениям. Может это сделано для того чтобы народ больше забывал освобождать память?

mx__ ★★★★★
() автор топика
Ответ на: комментарий от mx__

Кто же выделяет память в цикле. Ну и связанное с выходом из цикла потерянное освобождение gcc -fanalyzer сразу найдет. Так что это вообще не проблема.

То что представлено по break outer, это лишь замена goto которое все и писали.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 3)
Ответ на: комментарий от MOPKOBKA

Это понятно, но по я не силен в этом но помню когда то очень давно был басик и там была номерация строк и goto, (все это было в 80х) и потом я читал книжки по cи и хорошо помню что там обсуждали что goto и прерывания цикла куда хз куда это плохой стиль программирования и так лучше не делать.

Есть оператор switch и внутри его case или прерывают это или внутри что то воротят.

Представьте себе цикл где по goto наружу куда то, потом по goto в другую … бред какой то :(

mx__ ★★★★★
() автор топика
Ответ на: комментарий от mx__

Выход из вложенных циклов на goto это классика С, так что ноль изменений семантический, и есть лишь синтаксическое. Выход через goto используется и в ядре ... и везде.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)

это брик не только из текущего цикла, а из всех охватывающих циклов, включая цикл с этим именем.

известная вещь ващета. потому что такой выход неудобно писать тем, что есть сегодня.

alysnix ★★★
()
Ответ на: комментарий от alysnix

известная вещь ващета. потому что такой выход неудобно писать тем, что есть сегодня.

Повторение на goto ровно на один символ короче %)

MOPKOBKA ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Сейчас почитал, странно как то. У меня почему то в мозгу сидело что goto в си нужно избегать.

mx__ ★★★★★
() автор топика
Ответ на: комментарий от MOPKOBKA

Повторение на goto ровно на один символ короче %)

такой выход имеет строгую семантику, а через gotо можно улететь куда хошь.

alysnix ★★★
()
Ответ на: комментарий от mx__

У меня почему то в мозгу сидело что goto в си нужно избегать.

потому и ввели. потому что это семантически неуязвимый частный случай goto.

alysnix ★★★
()
Ответ на: комментарий от alysnix

Я не про это, я вообще про goto в общем. Правильно вы написали можно в пределах функции улететь куда хочешь :(

mx__ ★★★★★
() автор топика
Ответ на: комментарий от mx__

при дозированном использовании в определенных случаях, с точной семантикой, goto полезен. а при разнузданном - нет.

alysnix ★★★
()
Ответ на: комментарий от alysnix

Что значит с точной? Если бы все писали бы точно то не было бы вопрос про освобождение памяти и прочего.

Хотя если они хотят ввести такой break а goto выкинуть вообще то в принципе это будет правильный шаг, по моему мнению.

mx__ ★★★★★
() автор топика
Ответ на: комментарий от mx__

с точной, значит например оформление кода завершения блока, если не используешь raii впрямую, через деструкторы. без goto это красиво не сделаешь.

alysnix ★★★
()
Ответ на: комментарий от MOPKOBKA

используя goto можно написать любую запутанную фигню, которую сложно редактировать. а break с меткой однозначен, и проверяется. нельзя выйти из цикла в котором не находишься.

alysnix ★★★
()
Ответ на: комментарий от alysnix

нельзя выйти из цикла в котором не находишься.

локальные метки, видимые только в пределах блока.

anonymous
()
Ответ на: комментарий от anonymous

локальные метки, видимые только в пределах блока.

и что? кого это спасает.

while (...) {
  break c1; ///так нельзя
  goto label0;  /// так можно
}

c1: while (...) {  
  break c1; ///так можно
  goto label0; ///так можно
}

label0:

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)

Это фича из джавы, которую походу наконец-то завезли в C, можно из вложенных циклов без goto выходить будет.

Werenter ★★★
()
Ответ на: комментарий от alysnix

goto label0; ///так можно

выходишь из того же цикла, что и требовалось

Проблема goto не в том, откуда выходишь, а куда входишь. Можно запрыгнуть внутрь другого цикла.

anonymous
()
Ответ на: комментарий от MOPKOBKA

Кто же выделяет память в цикле.

Много кто. Потом надо не забыть в ещё одном цикле её освободить.

firkax ★★★★★
()
Ответ на: комментарий от Werenter

можно из вложенных циклов без goto выходить будет.

В ассемблере тоже можно из циклов без goto выходить! Всё дело в том, что там эта инструкция называется JMP.

firkax ★★★★★
()
Ответ на: комментарий от firkax

там целая группа Jxx инструкций

anonymous
()
Ответ на: комментарий от firkax

Дело в том что почему то плюсы си в конечном счете обзывает не безопасным языком (я не про этот случай)

mx__ ★★★★★
() автор топика

Не понял. Это что еще за бред?

Несколько более красивый goto, но всё равно не нужно. Комитету нужно постоянно доказывать свою нужность и внедрять новые фичи в язык, иначе комитет распустят, как это уже произошло с ELF.

X512 ★★★★★
()
Ответ на: комментарий от anonymous

Можно запрыгнуть внутрь другого цикла.

спасибо объяснил

alysnix ★★★
()

Это очередная ересь в нашей любимой сишке. C89 вечен!

anonymous
()
Ответ на: комментарий от firkax

Это из Фортрана 90. Как и модули. Только с опозданием на 35 лет.

anonymous
()

сначала кот боялся пылесоса, а потом ничего, втянулся (с)

olelookoe ★★★
()

Не понял. Это что еще за бред?

Еще одна «фича», которую предадут анафеме несколько потом, т.к. чаще всего эти вот выходы из вложенных циклов – просто кривой код (и в ядре тоже, мало ли как там привыкли ходить под себя), оставляющий руины от кэшфрендли и локальности.

anonymous
()

Меня несколько пугает, что компиляторы С++ становятся такими монстрами, что, наверное, уже нет ни одного человека на Земле, кто знал бы полностью, как такие компиляторы работают. И как доверять после этого компиляторам С++?

Ситуация усугубляется тем, что стандарты C++ становятся все сложнее и сложнее. Часто неоправданно сложнее.

По-моему уже пора пойти по обратному пути, когда новые стандарты C++ упрощали бы язык, а не усложняли. Может быть, так и будет когда-нибудь.

anonymous
()
Ответ на: комментарий от firkax

Это из джавы позаимствовали…

Да ладно? У Явы в 1996 году только первый релиз случился. Вот коротенький хелп к четвёртому Перлу датированный 1991 годом, в котором упоминаются меченые циклы, last и redo с метками (next [BLOCK] — это, возможно, ошибка, в пятом Перле после next можно поставить метку, а не блок).

P. S.

В Аде 95 операторы циклов тоже с метками:

loop_statement ::=
    [loop_statement_identifier:]
    [iteration_scheme] loop
    sequence_of_statements
    end loop [loop_identifier];

Равно как и оператор exit:

exit_statement ::=
    exit [loop_name] [when condition];
debugger ★★★★★
()
Последнее исправление: debugger (всего исправлений: 1)

Не понял. Это что еще за бред?

Это не бред. Это недостаток образования и кругозора.

debugger ★★★★★
()
Ответ на: комментарий от anonymous

Меня несколько пугает, что компиляторы С++ становятся такими монстрами, что, наверное, уже нет ни одного человека на Земле, кто знал бы полностью, как такие компиляторы работают. И как доверять после этого компиляторам С++?

Прежде всего, нужно задаться этим же вопросом о процессорах.

MOPKOBKA ★★★★★
()

а вы настоящий программист?

anonymous
()
Ответ на: комментарий от MOPKOBKA

хорошо что никто с лора к разработке производительных процессоров никакого отношения не имеет и не будет иметь

anonymous
()
Ответ на: комментарий от MOPKOBKA

Да. Не прошло и ..дцати лет. В фортране такое было с незапамятных лет.

thunar ★★★★★
()
Ответ на: комментарий от mx__

Нет. Это фанатики цитируют бездумно не вникая в контекст. Современные компиляторы просто не дадут скомпилировать то что Дейкстра критиковал в своей статье.

thunar ★★★★★
()
Ответ на: комментарий от mx__

Не куда хочешь — в строго в ограниченных пределах синтаксического дерева.

upd: А не, ошибся. C++ даёт ошибку, а C — только ворнинг.

thunar ★★★★★
()
Последнее исправление: thunar (всего исправлений: 4)
Ответ на: комментарий от mx__

У меня почему то в мозгу сидело что goto в си нужно избегать.

Считается, что goto допустимо в двух случаях:

  1. Выход из вложенных циклов.

  2. Переход для освобождения памяти.

Вот ковыряю libssh, там регулярно встречается конструкция goto err, которая в самом конце подпрограммы очищает память.

И сам похожие конструкции пишу:

void my_scp_subroutine(                                                           
        const session_connect_info *info,                                       
        const char *path,                                                       
        char **err_msg)                                                         
{                                                                                                                                                        
        int rc;                                                                 
        ssh_session *session;                                                    
        ssh_scp *scp;                                                                                                               
                                                                                
        start_session(session, info, err_msg);                                  
        if (*err_msg)                                                           
                return;                                                         
        start_scp(scp, session, path, err_msg);                                 
        if (*err_msg)                                                           
                goto free_session;                                              
                                                                                
        ...
     
        if (rc != OK) {                                                                                                
                load_err_msg(err_msg, err_scp);                                 
                goto free_scp;                                                  
        }                                                                       
                                                                                
        ...

free_scp:                                                                                                                            
        ssh_scp_close(scp);                                                                                                          
        ssh_scp_free(scp);                                                      
free_session:                                                                                                                        
        ssh_disconnect(session);                                                                                                     
        ssh_free(session);
}
Jullyfish
()
Ответ на: комментарий от anonymous

Ты думаешь, что разбиение на модули и под-модули спасет отца русской демократии и гиганта мысли? Там может быть куча эффектов, которые не укладываются в простую структуру. Моделирование и конструирование может отбросить лишь заведомо ложные варианты, но последнее слово всегда останется за опытными образцами и натурными экспериментами.

И да, аналогия с громоздкостью С++ уместна. Мне даже понравилось.

Не нужно думать, что современный софт развивается в правильном направлении. Это совсем не так. Вопрос в том, что толком никто не знает, каким должен быть софт на самом деле. Но мы точно ушли в софтостроении куда-то не туда. Я кучу времени потратил на С++, .NET и Java. И мне совсем не нравится, во что они выродились.

anonymous
()
Ответ на: комментарий от rupert

Шапка уже лет 20 как основной разраб гсс.

mx__ ★★★★★
() автор топика
Ответ на: комментарий от rupert

Сейчас глянул у себя в ф42, ну так сабж давно уже у нас в дистре, хм.

mx__ ★★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.