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

Передача параметров в функцию.

for(;;) {
   // endless loop
}

Совсем-совсем формально, возможно, и не отличается от while(1) {} (по стандарту для for(;;) «An omitted expression-2 is replaced by a nonzero constant»), но в качестве примера бесконечного цикла в C99 приведён именно этот вариант. В более ранних книгах тоже.

Не помню, чтобы я когда-либо писал while(1) :-)

Думаю, это рецидив паскаля :-)

 

Ни в каких компиляторах for(;;) никогда не оставляло хвостов недооптимизации в духе того, что бывало от while(1), например

  jmp cy_end
cy_start:
   ...
cy_end:
; типа оптимизировали и пред-проверку поставили в конце, чтобы уменьшить число переходов
; потом увидели, что условие константа и проверку убрали
; но убрать jmp cy_end в начале забыли
  jmp cy_start

 

Для чего обычно пользуем while(1)? Ну вроде как основная (теневая) задача крутится. Сиречь нечто, не слишком критичное по времени. Ну и зачем там борьба за возможную лишнюю команду? Возможную, так это дело качества компилятора.

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


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

Ну и зачем....

Я уже писал - как минимум это вопрос просто грамотности.

Кроме того, вечные циклы используются не только в одном единственном случае :). Задача как правило не одна, и вечные циклы с continue/break тоже совершенно обыденное дело.

 

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


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

Я уже писал - как минимум это вопрос просто грамотности.

Понятно - лично вам такое не нравится.

 

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

  if (__TIMER_USED & 0x01) {                                // TIM1 used
    ...
    }
  if (__TIMER_USED & 0x02) {                                // TIM2 used
    ...
    }

Те участки, где условие не выполняется, просто выкидываются компилятором. А что было бы если бы на каждый такой случай он выдавал предупреждение?

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

 

 

Для чего обычно пользуем while(1)? Ну вроде как основная (теневая) задача крутится. Сиречь нечто, не слишком критичное по времени. Ну и зачем там борьба за возможную лишнюю команду? Возможную, так это дело качества компилятора.

Тем более что эта команда стоит после цикла и никогда не будет выполнена.

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


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

Я уже писал - как минимум это вопрос просто грамотности.

 

лично мне кажется, что в данном вопросе while(1) vs for(;;) мы становимся заложниками того, что нам поведал гуру, и тот факт, что гуру мог быть в тот миг пьян, не в духе или просто не придал значения своим словам, даже не приходит нам в голову. я о знаменитых К&R. смотрите сами: while без выражения в скобках (т .е. с пустым местом) не может быть, в то же время в for второй операнд может быть пустым местом, причем, что самое странное, это пустое место воспринимается как истинное логическое выражение. налицо странные противоречия с логикой здравого смысла, возведенные в ранг закона: 1 - это значение логической истины, в то же самое время НИЧЕГО (пустое место), что мы привыкли отождествлять с НУЛЕМ, вдруг оказывается ИСТИНОЙ в другом операторе... мне кажется, что единожды признав, что А==B, надо впоследствии всегда придерживаться этого, а не менять на противоположное утверждение в зависимости от условий. то есть, сказав, что отсутствие операнда логического отношения приравнивается к ненулевому значению, следовало бы в стандарте допустить while() как пример бесконечного цикла, разрешить if() или switch() без операнда в скобках, а так же признать безошибочной запись а = ? 1 : 0;. а получается, что стандартизировали путаницу в понятиях.

 

с точки зрения здравого смысла оператор for(;;) куда более неграмотное выражение, нежели while(1) - по крайней мере последний здравому смыслу не противоречит.

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


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

лично мне кажется, что в данном вопросе while(1) vs for(;;) мы становимся заложниками того, что нам поведал гуру, и тот факт, что гуру мог быть в тот миг пьян, не в духе или просто не придал значения своим словам, даже не приходит нам в голову. я о знаменитых К&R.

смотрите сами: while без выражения в скобках (т .е. с пустым местом) не может быть, в то же время в for второй операнд может быть пустым местом, причем, что самое странное, это пустое место воспринимается как истинное логическое выражение. налицо странные противоречия с логикой здравого смысла

Они объясняли это тем, что for(;;) напоминает слово forever - навсегда, намекая на то, что это бесконечный цикл. Таким образом лингвистические соображения взяли верх над логическими.

 

с точки зрения здравого смысла оператор for(;;) куда более неграмотное выражение, нежели while(1) - по крайней мере последний здравому смыслу не противоречит.

+100

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


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

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

К счастью, не все комппиляторописатели сдаются перед малограмотной толпой :).

Вот, например, IAR:

D:WORK_ARMXADDMAINmain.c(440) : Remark[Pe236]: controlling expression is constant

Отключаемо, как и любые warnings/remarks но таки есть.

 

 

 

while(1) - по крайней мере последний здравому смыслу не противоречит.

Совершенно дикий у Вас "здравый смысл" - написать зачем-то бессмысленное выражение "пока белый цвет белого цвета", после чего ожидать, что компилятором оно будет похерено и получится то, что естественно пишется как for( ; ; ) - выполнять нечто без контроля каких-либо условий.

 

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

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

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


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

К счастью, не все комппиляторописатели сдаются перед малограмотной толпой :).

 

Что-то вы больно резковаты в выражениях. В конце концов, что такое программа? Инструкции процессору сделать то, что ВЫ от него хотите. Он это делает, хоть

1. while(1)

2. for(;;;)

3. label1:

...

goto label1;

 

Какая половая разница? Это напоминает религиозные войны против goto. А что, сколь нибудь значительные по длине циклы while и for в конце концов обходятся без команд переходов на уровне команд процессора?

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


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

Какая половая разница?

Что положить в чай сахар, что покласть, что набухать, чаю будет скорее всего все равно :(. Но втрое пока? еще большинству еще режет слух.

 

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


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

Совершенно дикий у Вас "здравый смысл" - написать зачем-то бессмысленное выражение "пока белый цвет белого цвета"

Что ж тут дикого? Аргументом оператора while является логическая переменная, она здесь присутствует и не равна нулю.

естественно пишется как for( ; ; ) - выполнять нечто без контроля каких-либо условий.

А чему равно значение логической переменной при ее отсутствии? :) Тут приходится записывать в стандарт костыль, явно утверждающий, что в данной констрокции (и только в ней и никакой больше) отсутствие переменной должно трактоваться как ее истинное значение, а в других случаях как ошибка. Или вы будете спорить с тем, что это костыль?

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

Но мы же не о скамейке говорим, а о языке программирования.

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


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

Что ж тут дикого? Аргументом оператора while является логическая переменная, она здесь присутствует и не равна нулю.

скамейке говорим, а о языке программирования.

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

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


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

Меня критикуют за цитаты из книг. Тем не менее. Герберт Шилдт "Полный справочник по С" 4-изд. Стр.98:

 

"while(условие) оператор;

..

 

Условие(управляющее выражение) может быть любым допустимым в языке выражением. Условие считается истинным, если значение выражения не равно нулю, а оператор выполняется, если условие принимает значение ИСТИНА."

 

Константа "1" не равна нулю и является допустимым в языке С выражением.

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


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

является допустимым в языке С выражением.

Именно по причине того, что это написано в стандарте ("Полные Справочники" я игнорирую :) ), я не говорю о том, что компилятор должен генерировать ошибку, только предупреждение о странном выражении в данном контексте.

А допустимых, но бессмысленных выражений написать можно массу, навскидку:

a = a;

b == a;

a; (это в случае, если "a" не volatile)

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


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

Воспринимается, как отсутствие каких либо условий для продолжения выполнения цикла.
вот вы сами себя и подловили :) : логика - штука железная. итак, провожу разбор вашего же утверждения: отсутствие условий для продолжения означает буквально не надо ничего делать, т.е. цикл должен бы быть не бесконечным, а пустым. ведь в цикле for второй операнд - именно условие ПРОДОЛЖЕНИЯ, а не прекращения цикла. было бы там условие прекращения - тогда ваше утверждение не вступало бы в противоречие со здравым смыслом: нет условий для завершения цикла - значит, цикл вечный.

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


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

разбор вашего же утверждения: отсутствие условий для продолжения означает буквально не надо ничего делать

Отсутствие условий для продолжения означает, что цикл выполняется БЕЗ всяких условий - безусловно.

http://www.classes.ru/all-russian/russian-...v-term-2249.htm

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

Точно так-же я знаю 'C' и не надо пытаться убеждать меня начинать писать на нем безграмотно. Все.

 

 

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


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

Отсутствие условий для продолжения означает, что цикл выполняется БЕЗ всяких условий - безусловно.

http://www.classes.ru/all-russian/russian-...v-term-2249.htm

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

Точно так-же я знаю 'C' и не надо пытаться убеждать меня начинать писать на нем безграмотно. Все.

я не сомневаюсь, что вы знаете Си на пять с плюсом. я не спорю с тем, что закреплено в стандарте Си. я не спорю с необходимостью соблюдать стандарт. я признаю, что соблюдение правил и есть "грамотность".

 

я лишь пытаюсь заострить ваше внимание на том, что это нелогично. безусловный - не то же самое, что отсутствие условия. пример: условием для продолжения плавания под водой [более 5 минут] является наличие специального дыхательного аппарата. в записи Си это выглядит примерно так: for(; акваланг != 0; ){плаваем}. по-вашему выходит, что отсутсвие всяких условий (for(;;)) вам позволит плавать под водой как угодно долго, как Ихтиандр? ;) вы же программист, логика у вас должна сидеть в мозгу лучше, чем даже родной язык! вдумайтесь!

 

и снова: даже если согласиться, что отсутствие условия для продолжения означает БЕЗУСЛОВНОЕ ПРОДОЛЖЕНИЕ, то почему не работает while() - ему надо ОБЯЗАТЕЛЬНО указать условие?! как тут с логикой?

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


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

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

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

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

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

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

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

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

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

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