Перейти к содержанию
    

Надо бывает много для чего, ну и чем for(;;) {break} или switch(0){} лучше while{}do(0), ну кроме того что вы его лично не любите?

1) Не надо было вообще ТАК писать, а написав, уж точно не страдать фигней и не преписывать неведомо зачем. Это понятно?

2) for(;;){breaк} абсолютно естественно без всяких натяжек. while... ненужный трюк со скользким условием на который нормальный компилятор выдает warning. "Личная нелюбовь" нипричем. Сколько раз будете спрашивать одно и то-же? Не надоело? Ответ давался. switch... примерно те-же яйца в профиль, что и while...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) бывают разные ситуации и условия, и иногда надо делать не что хочется. Это понятно?

 

2) цикл do{}while(условие) стандартом определен? - определен. 0 - как ложное условие стандартом определен? - определен. Значит никакого нарушения стандарта нет.

 

То что ваш любимы компилятор выдает на это варнинг ничего ровным счетом не значит, кроме того что авторы компилятора посчитали эту конструкцию более редкой и предупредели об этом, просто указав вам на возможную ошибку. Ровно как то что он не выдает варнинг на for(;;), потому что эту конструкцию авторы посчитали более часто употребимой. И ВСЕ!!!

 

Я вот тут недавно вообще столкнулся с проверкой кода по формальным признакам и узнал много много нового:) о том как надо и как не надо писать, и в этой области нарушения - это не варнинги, это ерроры, и писать надо как предписывают правила, а не блаж компилятора. Лично добавил несколько определений которые теперь висят у меня варнингом в среде, потому что иначе это была ошибка на формальной проверке и ничего не поделаешь....

 

Так что пока вы не покажете строчку стандарта где написано что конструкция do{}while(flase) запрещена, или выполниться не 1 раз, или что 0 под while будет трактован как-то еще кроме как ложь, все ваши аргументы будут лишь вашим личным субъективным мнением. Которое истинна только для вас:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и узнал много много нового...

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

Начать попытки думать можете с объясния того факта, что мне известы, как минимум, три компилятора выдающих предупреждение на всякие while(1) и ни одного компилятора не понимающего, в отличие от Вас, for(;;). Это раз. А так-же того факта, что нет никакой необходимости использовать все эти while(1) и do(0).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я могу прямо сейчас создать корпоротивное правило запрещающее использовать for(;;) и предписывающее использовать while(1). Более того я могу написать свой компилятор который будет это поощрять. И что фор станет хуже вайла?

 

Также я могу вам привести пример того когда это необходимо.

 

Вы трактуете мир на основании вашего несовершенства. Вы уверены что все дураки, кроме вас, а это между прочем грех и гордыня. С чего вы взяли что ваша старческая истерика лучше чем мысли других людей? Вы ведь не только мне написали в вызывающем тоне про думать и тому подобное? Попробуйте послежовать своему совету и начать думать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

for(;; )
{
if (cond1)
   break;
....
if(cond2)
  break;
....
break;
}

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

Изменено пользователем IgorKossak
избыточное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я могу прямо сейчас создать корпоротивное правило запрещающее использовать for(;;)

Вы уже создали себе в голове "правил" :). Ну и что? Задача убедить остальных жить по Вашим правилам. Та же история с языком и компилятором который Вы грозитесь написать.

Также я могу вам привести пример того когда это необходимо.

До сих пор этого здесь никто не смог, включая Вас.

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

Истерику это Вы сейчас демонстрируете в полный рост. Аргументов нет, вот и понеслись из Вас всякие передергивания "все дураки" да ссылки на "других людей", "старческие". За себя сами научитесь отвечать.

 

Не помню деталей..

Впомните - расскажете :)

и ваш вечный цикл требует не забыть брейк в конце.

А другой "не забыть" while(0) после :) где весь перечень того, чего нельзя забывать при программировании :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Удалил крайние сообщения с обсуждениями личных качеств пользователей.

При рецидиве начну банить.

Модератор

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чужие исходники это кладезь хитровывертов.

файл 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?

 

---------------

 

Что на вызовы через декларации не выдаются даже ремарки по терминологии ИАРа - это однозначно сговор.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...кладезь хитровывертов.

Нет. Это кто-то тупо мучал компилятор до тех пор пока что-то не "заработало" а остальное потом "отладит".

На каком языке это написано?

Олбанский?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На каком языке это написано? Внутри круглых скобок можно использовать фигурные?

Во-первых, разве в Си можно узнать значение локальной переменной вне блока, в котором она объявлена?

Во-вторых, разве точка запятой, завершающая оператор/statement не отбрасывает значение rvalue?

 

Это расширение gcc такое.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это расширение gcc такое.

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

 

Олбанский?

zltigo стыдно не знать распостранённые диалекты Си.

 

Что на вызовы через декларации не выдаются даже ремарки по терминологии ИАРа - это однозначно сговор.

Конечно же только на вызовы с параметрами. Не предусмотреть даже ручную включалку - злодеяние.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На первый взгляд, это какая-то лишняя сущность с нестандартным синтаксисом. Равноценно заменяется инлайн-функцией. Инлайн поддерживают все современные компиляторы. Имея все плюшки этой сущности и не ухудшая читабельность и красоту стандарта. 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;
  }();
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый вечер. Есть вопрос по Keil.

Неоднократно встречаю в проекте, что Keil подсвечивает некоторые #define красным крестиком, при наведении пишет undefined sybol. Но проект собирается. Не только #define, кстати, но и некоторые функции. Думаю и вы неоднократно замечали. Это, вообще говоря, как? Почему проект собирается, ведь это фатальная ошибка при сборке?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К примеру

Разве в первом примере не нужны круглые скобки, окружающие блок с фигурными? Насколько я понял из приведённого Вами описания "compound statement" с сайта gnu. И этот пример из серии за уши притягивания. В классическом Си такие значения хранились бы в переменных. В полноценном смысле константа - то, что расчитывается на этапе компиляции.

 

Во-вторых, инлайн честно может юзать локальные переменные вызывающей функции, только они должны передаваться через список аргументов функции. Это и стандартно и читабельно и безопасно. Для макроса по-другому опять же бэд бэд стайл. Когда будут прочитаны значения аргументов - зависит от атрибута volatile, без которого аргументы будут читаться в момент использования внутри функции или не читаться вообще. В большинстве случаев код будет не менее оптимально скомпилен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разве в первом примере не нужны круглые скобки, окружающие блок с фигурными?

Нужны, ошибся

И этот пример из серии за уши притягивания. В классическом Си такие значения хранились бы в переменных. В полноценном смысле константа - то, что расчитывается на этапе компиляции.

Что такое классический Си? Керниган и Ричи, первое издание? :) Жизнь не стоит на месте. Там уже и атомики в стандарте появились, и bool, и константы времени исполнения. Конкретно эта штука - расширение gcc (в стандарте его нет)

 

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

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

 

Для макроса по-другому опять же бэд бэд стайл.

Это как? Даже если у макроса есть аргументы, то там просто текстовая подстановка, аргументы будут "прочитаны" в момент обращения.

 

Ну и кстати - пример с замыканием из плюсов - это как раз ваша полноценная функция, просто с упрощенным синтаксисом. Как и какие локальные переменные будут захвачены - можно настроить в широких пределах

 

 

Неоднократно встречаю в проекте, что Keil подсвечивает некоторые #define красным крестиком, при наведении пишет undefined sybol. Но проект собирается. Не только #define, кстати, но и некоторые функции. Думаю и вы неоднократно замечали. Это, вообще говоря, как? Почему проект собирается, ведь это фатальная ошибка при сборке?

 

Кейлом не пользовался, но рискну предположить, что сборку делает компилятор, а данные для подсветки синтаксиса берутся из парсера самого кейла. Если этот парсер криво настроен (не видит каких-то инклюдов, предопределенных макросов и т.п.) или в нем есть баги - будут глюки с подсветкой и автокомплитом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...