zltigo 1 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба Надо бывает много для чего, ну и чем for(;;) {break} или switch(0){} лучше while{}do(0), ну кроме того что вы его лично не любите? 1) Не надо было вообще ТАК писать, а написав, уж точно не страдать фигней и не преписывать неведомо зачем. Это понятно? 2) for(;;){breaк} абсолютно естественно без всяких натяжек. while... ненужный трюк со скользким условием на который нормальный компилятор выдает warning. "Личная нелюбовь" нипричем. Сколько раз будете спрашивать одно и то-же? Не надоело? Ответ давался. switch... примерно те-же яйца в профиль, что и while... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба 1) бывают разные ситуации и условия, и иногда надо делать не что хочется. Это понятно? 2) цикл do{}while(условие) стандартом определен? - определен. 0 - как ложное условие стандартом определен? - определен. Значит никакого нарушения стандарта нет. То что ваш любимы компилятор выдает на это варнинг ничего ровным счетом не значит, кроме того что авторы компилятора посчитали эту конструкцию более редкой и предупредели об этом, просто указав вам на возможную ошибку. Ровно как то что он не выдает варнинг на for(;;), потому что эту конструкцию авторы посчитали более часто употребимой. И ВСЕ!!! Я вот тут недавно вообще столкнулся с проверкой кода по формальным признакам и узнал много много нового:) о том как надо и как не надо писать, и в этой области нарушения - это не варнинги, это ерроры, и писать надо как предписывают правила, а не блаж компилятора. Лично добавил несколько определений которые теперь висят у меня варнингом в среде, потому что иначе это была ошибка на формальной проверке и ничего не поделаешь.... Так что пока вы не покажете строчку стандарта где написано что конструкция do{}while(flase) запрещена, или выполниться не 1 раз, или что 0 под while будет трактован как-то еще кроме как ложь, все ваши аргументы будут лишь вашим личным субъективным мнением. Которое истинна только для вас:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба и узнал много много нового... остается только надеяться, что это не последнее новое, что Вы узнаете и то, что в процессе "узнавания" сможете сохранить способность самостоятельно думать. Начать попытки думать можете с объясния того факта, что мне известы, как минимум, три компилятора выдающих предупреждение на всякие while(1) и ни одного компилятора не понимающего, в отличие от Вас, for(;;). Это раз. А так-же того факта, что нет никакой необходимости использовать все эти while(1) и do(0). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба Я могу прямо сейчас создать корпоротивное правило запрещающее использовать for(;;) и предписывающее использовать while(1). Более того я могу написать свой компилятор который будет это поощрять. И что фор станет хуже вайла? Также я могу вам привести пример того когда это необходимо. Вы трактуете мир на основании вашего несовершенства. Вы уверены что все дураки, кроме вас, а это между прочем грех и гордыня. С чего вы взяли что ваша старческая истерика лучше чем мысли других людей? Вы ведь не только мне написали в вызывающем тоне про думать и тому подобное? Попробуйте послежовать своему совету и начать думать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 20 октября, 2015 Опубликовано 20 октября, 2015 (изменено) · Жалоба ... for(;; ) { if (cond1) break; .... if(cond2) break; .... break; } Не помню деталей, но надо было, чтобы точка с запятой требовалась в конце да и ваш вечный цикл требует не забыть брейк в конце. Вот это уже как раз кривая натяжка. Изменено 21 октября, 2015 пользователем IgorKossak избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба Я могу прямо сейчас создать корпоротивное правило запрещающее использовать for(;;) Вы уже создали себе в голове "правил" :). Ну и что? Задача убедить остальных жить по Вашим правилам. Та же история с языком и компилятором который Вы грозитесь написать. Также я могу вам привести пример того когда это необходимо. До сих пор этого здесь никто не смог, включая Вас. Вы трактуете мир на основании вашего несовершенства. Вы уверены что все дураки, кроме вас, а это между прочем грех и гордыня. С чего вы взяли что ваша старческая истерика лучше чем мысли других людей? Вы ведь не только мне написали в вызывающем тоне про думать и тому подобное? Истерику это Вы сейчас демонстрируете в полный рост. Аргументов нет, вот и понеслись из Вас всякие передергивания "все дураки" да ссылки на "других людей", "старческие". За себя сами научитесь отвечать. Не помню деталей.. Впомните - расскажете :) и ваш вечный цикл требует не забыть брейк в конце. А другой "не забыть" while(0) после :) где весь перечень того, чего нельзя забывать при программировании :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Удалил крайние сообщения с обсуждениями личных качеств пользователей. При рецидиве начну банить. Модератор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 24 октября, 2015 Опубликовано 24 октября, 2015 (изменено) · Жалоба Чужие исходники это кладезь хитровывертов. файл inflate.c #define NEXTBYTE() ({ int v = get_byte(); if (v < 0) goto underrun; (uch)v; }) в коде NEXTBYTE(); /* Get timestamp */ NEXTBYTE(); NEXTBYTE(); NEXTBYTE(); (void)NEXTBYTE(); (void)NEXTBYTE(); magic[0] = NEXTBYTE(); На каком языке это написано? Внутри круглых скобок можно использовать фигурные? uch вероятно объявлено как unsigned char. Как мне понимается, препроцессор заменит текстовым содержимым дефайна все заголовки NEXTBYTE(), встречающиеся в исходном тексте. Во-первых, разве в Си можно узнать значение локальной переменной вне блока, в котором она объявлена? Во-вторых, разве точка запятой, завершающая оператор/statement не отбрасывает значение rvalue? --------------- Что на вызовы через декларации не выдаются даже ремарки по терминологии ИАРа - это однозначно сговор. Изменено 24 октября, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 24 октября, 2015 Опубликовано 24 октября, 2015 · Жалоба ...кладезь хитровывертов. Нет. Это кто-то тупо мучал компилятор до тех пор пока что-то не "заработало" а остальное потом "отладит". На каком языке это написано? Олбанский? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 24 октября, 2015 Опубликовано 24 октября, 2015 · Жалоба На каком языке это написано? Внутри круглых скобок можно использовать фигурные? Во-первых, разве в Си можно узнать значение локальной переменной вне блока, в котором она объявлена? Во-вторых, разве точка запятой, завершающая оператор/statement не отбрасывает значение rvalue? Это расширение gcc такое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 16 ноября, 2015 Опубликовано 16 ноября, 2015 (изменено) · Жалоба Это расширение gcc такое. На первый взгляд, это какая-то лишняя сущность с нестандартным синтаксисом. Равноценно заменяется инлайн-функцией. Инлайн поддерживают все современные компиляторы. Имея все плюшки этой сущности и не ухудшая читабельность и красоту стандарта. goto изнутри круглых скобок во вне скобок - имхо бэд бэд стайл, особенно в макросе. Олбанский? zltigo стыдно не знать распостранённые диалекты Си. Что на вызовы через декларации не выдаются даже ремарки по терминологии ИАРа - это однозначно сговор. Конечно же только на вызовы с параметрами. Не предусмотреть даже ручную включалку - злодеяние. Изменено 16 ноября, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 16 ноября, 2015 Опубликовано 16 ноября, 2015 · Жалоба На первый взгляд, это какая-то лишняя сущность с нестандартным синтаксисом. Равноценно заменяется инлайн-функцией. Инлайн поддерживают все современные компиляторы. Имея все плюшки этой сущности и не ухудшая читабельность и красоту стандарта. goto изнутри круглых скобок во вне скобок - имхо бэд бэд стайл, особенно в макросе. Как сказать, штука иногда удобная. Инлайн-фукнции тут не причем. Это обычный блок кода, в котором можно использовать локальные переменные функции, и в котором есть собственные локальные переменные. Но в отличие от обычного блока он умеет возвращать результат. К примеру void f() { int a, b; ... const int c = { // константа со сложной формулой расчета int d = a + b + 42; if (d) d = g(d); if (d) d = q(d); d; } } В современных плюсах можно извернуться через замыкание void f() { int a, b; ... const int c = [&]{ int d = a + b + 42; if (d) d = g(d); if (d) d = q(d); return d; }(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 16 ноября, 2015 Опубликовано 16 ноября, 2015 · Жалоба Добрый вечер. Есть вопрос по Keil. Неоднократно встречаю в проекте, что Keil подсвечивает некоторые #define красным крестиком, при наведении пишет undefined sybol. Но проект собирается. Не только #define, кстати, но и некоторые функции. Думаю и вы неоднократно замечали. Это, вообще говоря, как? Почему проект собирается, ведь это фатальная ошибка при сборке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 16 ноября, 2015 Опубликовано 16 ноября, 2015 · Жалоба К примеру Разве в первом примере не нужны круглые скобки, окружающие блок с фигурными? Насколько я понял из приведённого Вами описания "compound statement" с сайта gnu. И этот пример из серии за уши притягивания. В классическом Си такие значения хранились бы в переменных. В полноценном смысле константа - то, что расчитывается на этапе компиляции. Во-вторых, инлайн честно может юзать локальные переменные вызывающей функции, только они должны передаваться через список аргументов функции. Это и стандартно и читабельно и безопасно. Для макроса по-другому опять же бэд бэд стайл. Когда будут прочитаны значения аргументов - зависит от атрибута volatile, без которого аргументы будут читаться в момент использования внутри функции или не читаться вообще. В большинстве случаев код будет не менее оптимально скомпилен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 17 ноября, 2015 Опубликовано 17 ноября, 2015 · Жалоба Разве в первом примере не нужны круглые скобки, окружающие блок с фигурными? Нужны, ошибся И этот пример из серии за уши притягивания. В классическом Си такие значения хранились бы в переменных. В полноценном смысле константа - то, что расчитывается на этапе компиляции. Что такое классический Си? Керниган и Ричи, первое издание? :) Жизнь не стоит на месте. Там уже и атомики в стандарте появились, и bool, и константы времени исполнения. Конкретно эта штука - расширение gcc (в стандарте его нет) Во-вторых, инлайн честно может юзать локальные переменные вызывающей функции, только они должны передаваться через список аргументов функции. Это и стандартно и читабельно и безопасно. Может, вот только писанины больше. Плюс мы имеет дополнительную лишнюю сущность - статическую функцию, которая дергается из одного места. Для макроса по-другому опять же бэд бэд стайл. Это как? Даже если у макроса есть аргументы, то там просто текстовая подстановка, аргументы будут "прочитаны" в момент обращения. Ну и кстати - пример с замыканием из плюсов - это как раз ваша полноценная функция, просто с упрощенным синтаксисом. Как и какие локальные переменные будут захвачены - можно настроить в широких пределах Неоднократно встречаю в проекте, что Keil подсвечивает некоторые #define красным крестиком, при наведении пишет undefined sybol. Но проект собирается. Не только #define, кстати, но и некоторые функции. Думаю и вы неоднократно замечали. Это, вообще говоря, как? Почему проект собирается, ведь это фатальная ошибка при сборке? Кейлом не пользовался, но рискну предположить, что сборку делает компилятор, а данные для подсветки синтаксиса берутся из парсера самого кейла. Если этот парсер криво настроен (не видит каких-то инклюдов, предопределенных макросов и т.п.) или в нем есть баги - будут глюки с подсветкой и автокомплитом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться