Так вот Си это тоже инструмент чтоб люди могли делать то что делать на ASM было бы сложно
практика это вторая стадия изучения (без неё первая стадия не имеет смысла) но вторая стадия без первой также бессмысленна как и первая без второй...
Вид для печати
У меня пявилась идея ... Напишу-ка я СИ компилятор для ZX'а ... На АСМЕ ... Будет поддержвать только стандарт С99 ... Люблю в качестве инструмента АСМ !!! Единственное не хочется библиотеки переписывать ... Они в СИ такие ограниченные. Но придётся ...
---
Кстати, у тебя на аватарке герой - "SPOOKED", игра велеколепно написана, вообще вся ONE-FRAME, и главное на АСМЕ !!!
Господа, когда вы перестанете путать кислое и длинное.
Объясняю для тех, кто на бронепоезде:
СИ ничего не знает про
а) особенности распараллеливания
б) кеш
в) особенности работы с внешними устройствами
г) и т.д.
Иметь в виду все вышеперечисленное- дело конкретного компилятора. И крайне глупо ругаться на ЯЗЫК, используя неподходящий КОМПИЛЯТОР, не НАСТРАИВАЯ его подобающим образом.
Это всё последствие полимики ...
Давайте лучше разберём стандарты:
1) while (TRUE) { };
На сколько принципиально ругаться на отсутствие ";" после "}" ???
2) char s[32];
sprintf (s,"Ura dedu morozu /* ");
sprintf (s,"Aru na deda moroza */ ");
Практическ все компиляторы думали, что между "/*" и "*/" всё заремлено, только мотороловский компилятор такое компилирует. В стадарте С99 наисано что такого делать нельзя и подобный код считаеся ошибкой. Предлагаю считать ошибкой, что считается ошибкой !!! Натуральная лень создателей сделать всё по-людски !!!
3) switch (?) {
case 0x02: assish;
case 0x01: popish;
case 0x00: kukish;
case 0x03: kakish;
}
В данной ситуации если "?" будет равен "1", то исполнится "popish; kukish; kakish;". С99 снова гласит, что нужно заканчивать "break;", прикрывая задницу, что это типа так придумали. На сколько это принципиально ??? Есть ли примеры, когда это так необходимо ?
a. Я изучил эту ситуацию и увидел, что KEIL под ARM-7 вообще тупо сортирует и исполнение получается таким: "popish; assish; kakish;".
b. IAR под ARM-7, херит регистры и память из-за оптимизации в зависимости от того, что в нутри "кейса".
c. ST-RealView исполняет често один "кейс".
Если стандарт С99 гласит писать "break;", может нужно сделать это автоматом и не парить мозги программисту !!!
4) Самое главное "жлобские маленькие буквАчки" !!! Предлагаю сделать универсально любыми !!! Как хочешь, так и пиши !!! Если етсь весомый довод, маленьких букв, то жду предлений ?
нинасколько, после закрывающей скобки блочного оператора ";" не нужна (но и не запрещается -- это просто пустой оператор, в строчке ";;;;;;;;" тоже нет никакой ошибки)
GCC компилит спокойно. 1й раз слышу, что так нельзя )
принято, но не обязательно. BTW, ты что за книжку по с99 читаешь? сроду break не был обязаловкой AFAIK, и кейсы без брейков используются на каджом шагу, например при разборе условных выражений в стиле php:
switch(operator)
{
case OP_IF:
/*пхаем на стек новую условную секцию*/
case OP_ELSEIF:
/*разбираем и вычисляем выражение, синтаксис которого одинаков для if и elseif*/
break;
default: err_exit("случилась фигня");
}
ты про чувствительность сишных идентификаторов к регистру? это юзается, и жить IMHO не мешает сршенно. к примеру константы препроцессора и значения enum'ов принято писать заглавными, чтоб не пересеклись с какой случайной переменной (переменные принято писать строчными) -- а то они на глобальном уровне, всякое может быть.
это не проблема стандарта, а проблема кривой реализации этого самого стандарта разработчиками некоторых компиляторов.
с этим я бы согласился если поменять 10% на 98% :) оговорюсь, это если разрабатывать под нормальные платформы типа десктопа, а не под маленькую тормозную железячку с минимумом памяти
Cи на спеке полезен для общей организации кода -- на нем хорошо писать этакий фреймворк, который вызывает ассемблерные процедуры (для такого, вобщем-то, хоть бейсик можно юзать) -- ресурсы не критичны, зато код легко структурировать. пример: z88dk+spritepack, на которых, насколько понимаю, писаны phantomasa и еще кое-чего из последнего (при всей неоптимальности пусть и ассемблерного spritepack, который построен по слишком обобщенной архитектуре, чтоб эффективно юзать ресурсы, игрулька вполне играбельная ;))
Глупо. Стандарт разрешает их не ставить.
Ну может так им было проще. Тем не менее- нарушение.
В случае, если "break" не стоит, что говорит стандарт? По идее, должно выполняться дальше до ближайшего или до конца свитча.
1) совместимость
2) стандартизация (как задали, так и пиши, не надо вводить в заблуждение)
3) шире пространство для идентификаторов
Я у себя на рабте вижу обратное ... Вот поэтому меня и раздражают СИ стандарт один а код разношёрстый. А потом сидишь и правишь половину чего-то кода, что бы можно было откомпилировать.
Кстати это как бы слеующий принципиальый вопрос, как красиво подружить СИ с асмом ... Надо будет подумать ...
Ну на калькулятор МК-61 писать не будем ... Как сказал Vitamin, СИ не знает какова железяка ... И я не вижу разницы в медленной или быстрой железяки ... Нет ничего плохого если прекрасно оптемизированный код будет велеколепно работать на супер быстрой железяке типа нашего Speccy !!! Но прикол с "МК-61" мне понравился ... :)