Сергей Борщ 134 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба Применение запятых в условии цикла while говорит о следующих друг за другом условиях.Нет, совсем нет. Результатом этих следующих друг за другом выражений будет значение последнего выражения. Именно результат k++ будет проверяться в цикле. Остальные два с тем же успехом можно было вынести из скобок в тело цикла. P.S. для меня конструкции с запятыми тоже нечто неестественное. ReAl их хорошо понимает и удачно использует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CSB 0 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба >Именно результат k++ будет проверяться в цикле. Возможно я не правильно понял что Вы имели ввиду под "результат k++", но в цикле будет проверятся k до инкрементирования и лишь потом будет увеличение на 1. Т.е. k до инкремента было нуль и поэтому условие не выполнилось. После выхода из цикла оно увеличится на 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба Возможно я не правильно понял что Вы имели ввиду под "результат k++",То, что понимают под этим K&R и стандарт языка С. Результатом выражения "k++" является значение k до выполнения этого выражения. То, что после этого выражения k увеличится на 1 - всего лишь "побочный эффект" этого выражения. Также как результатом выражения a = b является значение b, а тот факт, что после выполнения этого выражения то же самое значение оказывается в a - "побочный эффект", как бы парадоксально это не было :) Вдруг подумалось - а как компилятор вообще пропустил конструкцию for(,,) и не выругался на отсутствие там ";"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба Вдруг подумалось - а как компилятор вообще пропустил конструкцию for(,,) и не выругался на отсутствие там ";"? Не волнуйся, Сергей, на for(,,) компилятор ругается троекратно :) а while(,,) в общем случае допустимая конструкция. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба Не волнуйся, Сергей, на for(,,) компилятор ругается троекратно :)Вот и я такое помню, а в корневом посте жалоба на "не пишется", а не на "не компилится". Где-то нас на... обманули ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба Вот и я такое помню, а в корневом посте жалоба на "не пишется", а не на "не компилится". Где-то нас на... обманули ;) Это я ввел в заблуждение, мой глаз при быстром просмотре воспринял сстрочку while(,,) как for(;;) Но как признался автор, именно это он и хотел написать. Виноват , сам уже потом понял. Я и раньше так писал, но забыл. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 18 января, 2008 Опубликовано 18 января, 2008 · Жалоба С запятыми в IAR AVR вообще интересная штука. Начиная с 4 версии в режиме С++ спокойно компилятором глотается запятая вместо классической точки запятой. Вопрос - это стандарт или особенность IAR. Оригинала стандарта под рукой нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 18 января, 2008 Опубликовано 18 января, 2008 · Жалоба Начиная с 4 версии в режиме С++ спокойно компилятором глотается запятая вместо классической точки запятойВозможно вы просто не знали, что в С и С++ существует оператор "запятая". Вот что нам пишут о нем K&R в главе 3:Последней операцией языка "C" является запятая ",", которая чаще всегоиспользуется в операторе for. Два выражения, разделенные запятой,вычисляются слева направо, причем типом и значением результата являются тип и значение правого операнда. Таким образом, в различные части оператора for можно включить несколько выражений, например, для параллельного изменения двух индексов. Это иллюстрируется функцией reverse(s), которая располагает строку s в обратном порядке на том же месте. Запятые, которые разделяют аргументы функций, переменные в описаниях и т.д., не имеют отношения к операции запятая и не обеспечивают вычисленийслева направо. Оператор "запятая" может применяться и вне циклов. Не удержусь и приведу пример, который в 2002 ReAl выкладывал в ru.embedded. Я периодически медитирую над этим куском кода, но "почувствовать" его до конца пока не могу:У меня время от времени встречаются вещи типа if( ( func1(), condition1 ) || ( func2(), condition2 ) || ( func3(), condition3 ) ) { some_error_processing; } которые без запятой приходилось бы писать как func1(); if( condition1 ) { some_error_processing; } else { func2(); if( condition2 ) { some_error_processing; } else { func3(); if( condition3 ) { some_error_processing; } } } Или как-то по другому, но все равно многоэтажная конструкция. На _мой_ взгляд - через запятую это гораздо нагляднее и управляемее. Я считаю, что такая запись как раз уменьшает размер глюкодрома, хотя многие ругают С как раз за возможность такого рода записей :-) IMHO и while( small_code, condition) { code; } выглядит лучше, чем small_code; while( condition) { code; small_code; } так как в первом варианте четче прослеживается связь между small_code и проверкой условия, а также то, что small_code должен выполняться перед code, что это не завершающие операции code, а предшествующие проверке. P.S. Надеюсь, ReAl не обидится на меня за цитирование без разрешения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 18 января, 2008 Опубликовано 18 января, 2008 · Жалоба А если вне циклов, найдите отличия: Классика: 94 InputBuffer[0] = 0xab; \ 0000002A EA0B LDI R16, 171 \ 0000002C 01FD MOVW R31:R30, R27:R26 \ 0000002E 8305 STD Z+5, R16 95 InputBuffer[1] = 0x55; \ 00000030 E505 LDI R16, 85 \ 00000032 01FD MOVW R31:R30, R27:R26 \ 00000034 8306 STD Z+6, R16 Запятая: 94 InputBuffer[0] = 0xab, 95 InputBuffer[1] = 0x55; \ 0000002A EA0B LDI R16, 171 \ 0000002C 01FD MOVW R31:R30, R27:R26 \ 0000002E 8305 STD Z+5, R16 \ 00000030 E505 LDI R16, 85 \ 00000032 01FD MOVW R31:R30, R27:R26 \ 00000034 8306 STD Z+6, R16 Я имел в виду именно такой случай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 18 января, 2008 Опубликовано 18 января, 2008 · Жалоба А если вне циклов, найдите отличия: Я имел в виду именно такой случай. Не вижу криминала. Использование оператора "запятая" в этом месте допустимо. Ваша запись представляет собой два выражения. В первом случае они разделены точками последовательности (sequence points), во втором случае - объединены оператором "запятая". В обоих случаях результаты этих выражений не используются, поэтому имеем идентичный сгенерированный код вычисления этих выражений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 18 января, 2008 Опубликовано 18 января, 2008 · Жалоба А если вне циклов, найдите отличия: Классика: InputBuffer[0] = 0xab; InputBuffer[1] = 0x55; Запятая: InputBuffer[0] = 0xab, InputBuffer[1] = 0x55; :) Я и так могу написать, и код будет абсолютно такой же switch( InputBuffer[0] = 0xab) { default: InputBuffer[1] = 0x55; } ну и что с того? Да, некоторые конструкции в некоторых случаях железно "ничего не делают". Это не означает, что их стоит в этих случаях применять. Оператор запятая свой левый операнд вычисляет, но результат отбрасывает. Реально выполняются только побочные эффекты вычисления. Собственно, InputBuffer[1] = 0x55; делает то же самое - выполняется побочное дейстиве вычисления присваивающего выражения (занесение результата в левый операнд), а его результат в данной строке отбрасывается. Только поэтому в данном месте эффект от запятой и от точки с запятой одинаковый. Вот в switch( InputBuffer[1] = 0x55 ) результат присваивающего выражения анализируется, а не только побочный эффект работает. А в этом выражении a + b; и результат отбрасывается, и побочных действий нет (если a и b не квалифицированы как volatile-объекты), поэтому в итоге код вообще не генерируется. Я имел в виду именно такой случай. Этот? С запятыми в IAR AVR вообще интересная штука. Начиная с 4 версии в режиме С++ спокойно компилятором глотается запятая вместо классической точки запятой.Как уже написал Сергей - "запятая" столь же "классическая" в С, как и "точка с запятой" Если IAR более ранних версий указанные выше два примера (названных как "классика" и "запятая") компилировал в разный по действию код или ругался, то он был просто очень не прав. Так как эти варианты обязаны давать одинаковые действия и компилировались одинаково любым С-компилятором под "Электронику-60" много лет назад. Запятая - интересный и иногда очень удобный оператор, но писать его где попало из понту или "а чтобы была только одна ';' на строке" - это... Даже слов не нахожу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 18 января, 2008 Опубликовано 18 января, 2008 · Жалоба Запятая - интересный и иногда очень удобный оператор, но писать его где попало из понту или "а чтобы была только одна ';' на строке" - это... Даже слов не нахожу. Спасибо за разъяснения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Freeze 0 5 февраля, 2008 Опубликовано 5 февраля, 2008 · Жалоба я извиняюсь... прочитал тут дискуссию и не понял одного... вы тут говорите о запятых и точках с запятыми... но... разве в выражении (если бы цикл и выполнялся) while(k=0, k<9, k++) sens[0][k]=0xff; не происходило бы постоянное присваивание k=0?.. ведь даже если мы сделаем while(k=0, k++, k<9) sens[0][k]=0xff; у нас все равно не должно произойти заполнения массива... мы просто получили бесконечный цикл... или я не прав? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CSB 0 5 февраля, 2008 Опубликовано 5 февраля, 2008 (изменено) · Жалоба (k=0, k<9, k++) - это все 0, т.е. инструкция не выполнится (k=0, k<9, ++k) - а это будет 1 во втором случае бесконечный цикл. while(k=0, k++, k<9) sens[0][k]=0xff; - это тоже вечный цикл Изменено 5 февраля, 2008 пользователем CSB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться