Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача параметров в функцию.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
zltigo
QUOTE (777777 @ Aug 22 2011, 07:25) *
Вообще-то никакие компиляторы давно не выдают предупреждений в подобных случаях.

К счастью, не все комппиляторописатели сдаются перед малограмотной толпой sm.gif.
Вот, например, IAR:
QUOTE
D:WORK_ARMXADDMAINmain.c(440) : Remark[Pe236]: controlling expression is constant

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



QUOTE (ARV @ Aug 22 2011, 08:23) *
while(1) - по крайней мере последний здравому смыслу не противоречит.

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

QUOTE (ARV @ Aug 22 2011, 08:23) *
в то же время в for второй операнд может быть пустым местом, причем, что самое странное, это пустое место воспринимается как истинное логическое выражение.

Воспринимается, как отсутствие каких либо условий для продолжения выполнения цикла. Отсутствие запретов и контроля трактуется, как разрешение. Отсутствие таблички на скамейке в парке об ограничении является естественным указанием на то, что сидеть можно. Табличка на зеленой скамейке - сидеть можно пока скамейка зеленая, просто идиотская.
sergeeff
Цитата(zltigo @ Aug 22 2011, 11:18) *
К счастью, не все комппиляторописатели сдаются перед малограмотной толпой sm.gif.


Что-то вы больно резковаты в выражениях. В конце концов, что такое программа? Инструкции процессору сделать то, что ВЫ от него хотите. Он это делает, хоть
1. while(1)
2. for(;;;)
3. label1:
...
goto label1;

Какая половая разница? Это напоминает религиозные войны против goto. А что, сколь нибудь значительные по длине циклы while и for в конце концов обходятся без команд переходов на уровне команд процессора?
zltigo
QUOTE (sergeeff @ Aug 22 2011, 11:35) *
Какая половая разница?

Что положить в чай сахар, что покласть, что набухать, чаю будет скорее всего все равно sad.gif. Но втрое пока? еще большинству еще режет слух.
777777
Цитата(zltigo @ Aug 22 2011, 12:29) *
Совершенно дикий у Вас "здравый смысл" - написать зачем-то бессмысленное выражение "пока белый цвет белого цвета"

Что ж тут дикого? Аргументом оператора while является логическая переменная, она здесь присутствует и не равна нулю.
Цитата(zltigo @ Aug 22 2011, 12:29) *
естественно пишется как for( ; ; ) - выполнять нечто без контроля каких-либо условий.

А чему равно значение логической переменной при ее отсутствии? sm.gif Тут приходится записывать в стандарт костыль, явно утверждающий, что в данной констрокции (и только в ней и никакой больше) отсутствие переменной должно трактоваться как ее истинное значение, а в других случаях как ошибка. Или вы будете спорить с тем, что это костыль?
Цитата(zltigo @ Aug 22 2011, 12:29) *
Отсутствие таблички на скамейке в парке об ограничении является естественным указанием на то, что сидеть можно. Табличка на зеленой скамейке - сидеть можно пока скамейка зеленая, просто идиотская.

Но мы же не о скамейке говорим, а о языке программирования.
zltigo
QUOTE (777777 @ Aug 22 2011, 12:15) *
Что ж тут дикого? Аргументом оператора while является логическая переменная, она здесь присутствует и не равна нулю.
скамейке говорим, а о языке программирования.

Неправильное, то, что тут присутствует КОНСТАНТА, а не, как Вы сами-же и написали, переменная или выражение. На эту, и вообще все, неправильности компилятору следует реагировать, как на места возможной ошибки программиста, или не полного понимания того, что программист хотел от компилятора.
sergeeff
Меня критикуют за цитаты из книг. Тем не менее. Герберт Шилдт "Полный справочник по С" 4-изд. Стр.98:

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

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

Константа "1" не равна нулю и является допустимым в языке С выражением.
zltigo
QUOTE (sergeeff @ Aug 22 2011, 13:04) *
является допустимым в языке С выражением.

Именно по причине того, что это написано в стандарте ("Полные Справочники" я игнорирую sm.gif ), я не говорю о том, что компилятор должен генерировать ошибку, только предупреждение о странном выражении в данном контексте.
А допустимых, но бессмысленных выражений написать можно массу, навскидку:
a = a;
b == a;
a; (это в случае, если "a" не volatile)
ARV
Цитата(zltigo @ Aug 22 2011, 11:29) *
Воспринимается, как отсутствие каких либо условий для продолжения выполнения цикла.
вот вы сами себя и подловили sm.gif : логика - штука железная. итак, провожу разбор вашего же утверждения: отсутствие условий для продолжения означает буквально не надо ничего делать, т.е. цикл должен бы быть не бесконечным, а пустым. ведь в цикле for второй операнд - именно условие ПРОДОЛЖЕНИЯ, а не прекращения цикла. было бы там условие прекращения - тогда ваше утверждение не вступало бы в противоречие со здравым смыслом: нет условий для завершения цикла - значит, цикл вечный.
zltigo
QUOTE (ARV @ Aug 22 2011, 15:42) *
разбор вашего же утверждения: отсутствие условий для продолжения означает буквально не надо ничего делать

Отсутствие условий для продолжения означает, что цикл выполняется БЕЗ всяких условий - безусловно.
http://www.classes.ru/all-russian/russian-...v-term-2249.htm
Я русский язык, поскольку учился с 6 класса в русской школе, причем очень хорошей русской школе "за бугром", знаю достаточно прилично.
Точно так-же я знаю 'C' и не надо пытаться убеждать меня начинать писать на нем безграмотно. Все.

ARV
Цитата(zltigo @ Aug 22 2011, 15:53) *
Отсутствие условий для продолжения означает, что цикл выполняется БЕЗ всяких условий - безусловно.
http://www.classes.ru/all-russian/russian-...v-term-2249.htm
Я русский язык, поскольку учился с 6 класса в русской школе, причем очень хорошей русской школе "за бугром", знаю достаточно прилично.
Точно так-же я знаю 'C' и не надо пытаться убеждать меня начинать писать на нем безграмотно. Все.
я не сомневаюсь, что вы знаете Си на пять с плюсом. я не спорю с тем, что закреплено в стандарте Си. я не спорю с необходимостью соблюдать стандарт. я признаю, что соблюдение правил и есть "грамотность".

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

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

Например, не стали преумножать способы сделать одно и то-же, сделав такую возможность для for(), как продвинутого варианта while(). Я, пожалуй, ничего против использования и for() без условия не имею, но но в стандарте не требуется. Лично я от отсутствия такой возможности неудобств не испытываю - мне достаточно одного канонического способа однозначного донесения моей мысли компилятору.
QUOTE (ARV @ Aug 22 2011, 16:32) *
на том, что это нелогично

А я уже пытался объяснить Вам, что отсутствие на парковой скамейке таблички, о том, что на ней сидеть можно, равно, как и присутствие такой таблички, означает в конце-концов одно и то-же - сидеть на этой скамейке можно. Только отсутствие таблички с условиями выполнения цикла сидения на скамейке является для меня sm.gif много более естественным в нормальной жизни.
ARV
Цитата(zltigo @ Aug 22 2011, 17:26) *
Например, не стали преумножать способы сделать одно и то-же, сделав такую возможность для for(), как продвинутого варианта while(). Я, пожалуй, ничего против использования и for() без условия не имею, но но в стандарте не требуется. Лично я от отсутствия такой возможности неудобств не испытываю - мне достаточно одного канонического способа однозначного донесения моей мысли компилятору.

А я уже пытался объяснить Вам, что отсутствие на парковой скамейке таблички, о том, что на ней сидеть можно, равно, как и присутствие такой таблички, означает одно и то-же - сидеть на этой скамейке можно. Только отсутствие таблички с условиями выполнения цикла сидения на скамейке является много более естественным в нормальной жизни.
странно... в одном месте отсутствие операнда приравнивается к ненулевому значению, а в другом - к ошибке... здесь, значит, варианты не поленились множить...
как прокомментируете пример с аквалангом? записи while(акваланг != 0) и for(; акваланг !=0; ) читаются и понимаются абсолютно однозначно и логично, но for(;;) ?!

теперь о ваших скамейках sm.gif представим себе, что в парке вы увидели два вида скамеек: на одних есть надпись СИДЕТЬ МОЖНО, а другие - без оных надписей. это аналоги while(1) и for(;;). в ОБЫЧНОЙ ЖИЗНИ каждый, кто умеет читать, задумается - зачем это на некоторых есть надписи? может, на тех, где нет надписей, СИДЕТЬ НЕЛЬЗЯ?! ведь неспроста же пометили часть скамеек?! вам не кажется, что это логично? я уверен, что даже вы, для которого "отсутсвие таблички много более естественно", перед тем, как сесть на непомеченную скамейку тщательно ее ощупаете - а не покрашена ли она? sm.gif
в Си есть два цикла (скамейки), позволяющие сделать одно и то же: бесконечно выполняться (сидеть). но для одного нужно явное указание о бесконечности (табличка), для другого - не нужно. где же логика?!
zltigo
QUOTE
но for(;;)

Это значит, что наличие акваланга не требуется. В while(1) "1" это тоже не "акваланг", а некий не существующий в реальности костыль-заменитель всего и вся - акваланга, пива, женщин, воды ...
Я не хочу продолжать этот ставший уже бессмысленным разговор. Свою позицию по while(1) я изложил уже неоднократно и на разные лады. Достаточно.
Petka
Цитата(zltigo @ Aug 22 2011, 18:42) *
Это значит, что наличие акваланга не требуется. В while(1) "1" это тоже не "акваланг", а некий не существующий в реальности костыль-заменитель всего и вся - акваланга, пива, женщин, воды ...
Я не хочу продолжать этот ставший уже бессмысленным разговор. Свою позицию по while(1) я изложил уже неоднократно и на разные лады. Достаточно.

У меня к Вам один вопрос: почему в случае "for(;;)" компилятор НЕ должен генерировать warning а в случае "while(1)" должен? Чем эти случаи отличаются с точки зрения генерирования варнингов?
zltigo
QUOTE (Petka @ Aug 22 2011, 17:55) *
У меня к Вам один вопрос: почему в случае "for(;;)" компилятор НЕ должен генерировать warning а в случае "while(1)" должен? Чем эти случаи отличаются с точки зрения генерирования варнингов?

Почитайте, наконец-то предыдущие посты. Там цитируется стандарт языка в котором все параметры for() являются необязательными. Компилятор соответствующий стандарту просто не имеет права возмущаться этим фактом. Почему while(1) является неграмотное выражением на которое желательно генерить warning - разжевано в десятках предыдущих постов.
Я все сказал.
ARV
Цитата(zltigo @ Aug 22 2011, 19:02) *
Там цитируется стандарт языка в котором ...
Истинно, ибо верую...


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

Petka
Цитата(zltigo @ Aug 22 2011, 19:02) *
Почитайте, наконец-то предыдущие посты. Там цитируется стандарт языка в котором все параметры for() являются необязательными. Компилятор соответствующий стандарту просто не имеет права возмущаться этим фактом. Почему while(1) неграмотное выражение на которое желательно генерить warning - разжевано в десятках предыдущих постов.
Я все сказал.

Второй раз перечитал Ваши посты. Честно-говоря ничего кроме эмоций, "скамеек", "аквалангов", "коммерческих компиляторов" я там относящегося к делу не нашёл. Тыкните носом меня в пост со ссылкой на стандарт или хотя-бы на авторитетное толкование стандарта.
sergeeff
Думается мне, что все, как часто это бывает в жизни, проще. Отцы-основатели K&R порешили сделать for(;;) бесконечным циклом. Может на первый взгляд все показалось логичным, может еще какие мысли были, только они и знают. А потом может и обнаружилась нелогичность, может нет, не менять же. Так все и осталось.

Я застал по жизни людей, разрабатывавших языки программирования с карандашом в руках. Забавные ассемблеры (по-русски автокоды) с командами СУММ, ВЫВ, ВВ и прочее. Интересные были люди со своим особым стилем мышления. Так что все возможно.
_Pasha
Главная-таки проблема: если в стандарт закралась глупенькая недальновидность - все, поздно. Придется соблюдать. И после убрать таковую в следующей редакции стандарта невозможно в силу наработок
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.