Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет kouzdra ([info]kouzdra)
@ 2008-08-03 11:08:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:Вестник Дурдома, Компутерщина

Удивительное рядом...
А знаете ли вы, что вот такой код в языке ЦПП является корректным (а GCC даже предупреждения не выдает):

  switch (i) {
    do {
       case 1: break;
    } while (1);
    
  }


(Добавить комментарий)


[info]ketmar
2008-08-03 13:21 (ссылка)
и что бы сия бредятина значила, интересно?

(Ответить) (Ветвь дискуссии)


[info]pilpilon
2008-08-03 14:32 (ссылка)
сия бредятина означает, что switch в C++ есть мощный низкоуровневый инструмент, или, другими словами, пользоваться им лучше не надо, если не нужно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ketmar
2008-08-03 14:36 (ссылка)
сия бредятина в принципе ничего адекватного не означает. не надо было страусу наркоту синтезировать — и не было бы фигни.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]pilpilon
2008-08-03 14:41 (ссылка)
А вот страус тут конкретно не причем. Тяжелое наследие царизма, к Ритчи все претензии. ( Но у того был на то резон, наверно).

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ketmar
2008-08-03 14:43 (ссылка)
речь-то про цпп. надо бы, конечно, почитать стандарт. может, там просто unspecified behaviour.

впрочем, стоит ли ожидать строгого поведения от макроассемблера?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]pilpilon
2008-08-03 15:24 (ссылка)
C++ обратно совместим с C, намеренно проектировался так, особенно в том, что касается управляющих последовательностей. про макроассемблер смешно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ketmar
2008-08-03 15:32 (ссылка)
>C++ обратно совместим с C
бугога. подсказать про несовместимость указателей, например, или сам в курсе? про extern "C" не надо, это не совместимость, а костыль.

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

>про макроассемблер смешно.
а что такое C, по-твоему? обычный макроассемблер с претензией на архитектурную индифферентность. ну, пусть немного продвинутый макроассемблер. не более.

ЯВУ — это хацкель, например; оберон. а C до ЯВУ не доросло. да и не пыталось, задачи другие.

(Ответить) (Уровень выше)


[info]ketmar
2008-08-03 15:32 (ссылка)
кстати, страус говорит, что цпп вообще не проектировался.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]pilpilon
2008-08-03 16:29 (ссылка)
В курсе, в курсе. и даже в том что касается управляющих конструкций( о чем я и говорил) не всегда совместим. но это отклонения от первоначального дизайна, и на таждый раз должен был быть солидный резон. а про switch в C++ не могло быть солидного резона менять, поскольку он и так не рекомендован к использованию ( кроме тех случаев, когда использует понимает, зачем он его использует, а значит и понимает, что собственно switch делает.)

C это эта.., слабостатическитипизированный императивный язык, вот.

ни C, ни C++, никогда не имелись ввиду как Яву, хотя возможно их кое-кто так пытался продавать, не знаю.

Objective C, это прекрасно, конечно, но что-то им никто широко не пользуется. наркоты наверно мало положили ( это в меншей степени дурная шутка, чем это кажется на первый взгляд).

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ketmar
2008-08-03 16:40 (ссылка)
>про switch в C++ не могло быть солидного резона менять, поскольку он и так не
>рекомендован к использованию

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

>слабостатическитипизированный императивный язык
ну так натуральный ассемблер тоже. только типов чуть меньше.

>ни C++, никогда не имелись ввиду как Яву
цпп ещё как.

>что-то им никто широко не пользуется
яблок мало? я бы не сказал, что писатели под макось — почти никто. да и GNUstep помирать не собирается.

на самом деле пиара просто не гнали, юзали себе молча. и сейчас юзают. потому что оно вменяемо, а цпп — нет. если кто не согласен — предлагаю сравнить время, необходимое на изучение Objective C и цпп. только не «hello, world», а всего языка с ньюансами. при том, что программер C уже знает. разница будет исчисляться в порядках, а не в разах.

самый большой недостаток цпп — это то, что оно почти как C. но не C. когда пишешь и на том, и на том — дурные ньюансы запоминаются с трудом. поневоле начинаешь делать из C цпп (потому что в цпп больше ограничений).

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]pilpilon
2008-08-03 17:27 (ссылка)
>
как было сказано, кроме тех случаев, когда он нужен. он по идее очень быстрый.
Это на самом деле такое goto просто.

>
>
Когда создавался C, под языком высокого уровня понимался язык, не привязанный к конкретной модели компьютера. когда создавался C++, это определение уже не было так входу, но еще всеми осознавалось. (то есть, тогда под ЯВУ понимался как раз "макроассемблер с претензией на архитектурную индифферентность".) когда значение этого термина поменялось, C и C++ перестали так называть, везде и всюду подчеркивая, что это языки системного программирования. Цтрауструп в последнее время не рекомендует C++ для написания приложений вообще, а только для библиотек ( кроме тех случаев, как обычно, когда вы знаете, что вы делаете).

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

C++ тоже пиара не гнали. оно как-то сомо произошло, именно потому, что оно почти как C. в реальности, никто никогда не начинал писать на C++, предварительно выучив его с нюансами.

Последний смешной случай, читал я как-то Planet KDE, и там один типа разработчик, достаточно активный и эффективный, раз на планету попал, пишет:
"О, я понял, в C++ есть конструкоры и деструкторы! это такая вещь!"

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

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ketmar
2008-08-04 00:06 (ссылка)
цпп? для библиотек? убивать.

>Яблок мало. Это как если бы Джавой пользовались только в SUN , ну и еще один-два
>проекта опенсурсных.

я бы сказал, что весьма немало. но это субъективно, конечно.

>в реальности, никто никогда не начинал писать на C++, предварительно выучив его с
>нюансами.

ну и получается описаный тобой ниже ужоснах.

>я очень ругался, прописывая в C инициализацию вручную.
дык скриптиком, пусть себе сформирует. %-)

(Ответить) (Уровень выше)


[info]q
2008-08-03 21:28 (ссылка)
Да-да, "макроассемблер".

Хорош макроассемблер, который не гарантирует длину величины типа int.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ketmar
2008-08-03 23:31 (ссылка)
как это «не гарантирует»? вполне. short <= int <= long.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]q
2008-08-04 13:20 (ссылка)
А ещё лучше так: "гарантируется, что переменная int имеет конечную длину в байтах".

Тоже ведь гарантия.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ketmar
2008-08-04 21:10 (ссылка)
разница большая. а для конкретного размера — sys/types.h тебе в руки, оно входит в стандарт POSIX.

(Ответить) (Уровень выше)


[info]pilpilon
2008-08-03 14:29 (ссылка)
знаем.

(Ответить)


[info]anonymous
2008-08-03 20:18 (ссылка)
Разумеется, является. И в C он тоже корректный, что характерно. Как иначе Duff's_device можно было бы реализовать?

(Ответить)


[info]ppkk
2008-08-03 23:31 (ссылка)
Думаю, это к [info]qwerty: он как-то радовался извращениям над switch уже. http://lj.rossia.org/users/qwerty/77551.html?nc=13

(Ответить)


[info]ash_rabbi
2008-08-04 10:37 (ссылка)
Что-то я расово не прозреваю, что сей код может значить...

(Ответить) (Ветвь дискуссии)


[info]kouzdra
2008-08-04 11:17 (ссылка)
Ну case n - это просто метка, а содержательных примеров с пояснениями в комментариях уже кучу накидали. В том коде, откуда я это вытащил, оно применялось для другого - для упрятывания case в макро внутрь do {} while (0) - известный способ "съесть" ; после вызова макроса.

(Ответить) (Уровень выше)