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

Применение запятых в условии цикла while говорит о следующих друг за другом условиях.
Нет, совсем нет. Результатом этих следующих друг за другом выражений будет значение последнего выражения. Именно результат k++ будет проверяться в цикле. Остальные два с тем же успехом можно было вынести из скобок в тело цикла.

P.S. для меня конструкции с запятыми тоже нечто неестественное. ReAl их хорошо понимает и удачно использует.

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


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

>Именно результат k++ будет проверяться в цикле.

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

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


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

Возможно я не правильно понял что Вы имели ввиду под "результат k++",
То, что понимают под этим K&R и стандарт языка С. Результатом выражения "k++" является значение k до выполнения этого выражения. То, что после этого выражения k увеличится на 1 - всего лишь "побочный эффект" этого выражения. Также как результатом выражения a = b является значение b, а тот факт, что после выполнения этого выражения то же самое значение оказывается в a - "побочный эффект", как бы парадоксально это не было :)

 

Вдруг подумалось - а как компилятор вообще пропустил конструкцию for(,,) и не выругался на отсутствие там ";"?

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


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

Вдруг подумалось - а как компилятор вообще пропустил конструкцию for(,,) и не выругался на отсутствие там ";"?

Не волнуйся, Сергей, на for(,,) компилятор ругается троекратно :)

а while(,,) в общем случае допустимая конструкция.

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


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

Не волнуйся, Сергей, на for(,,) компилятор ругается троекратно :)
Вот и я такое помню, а в корневом посте жалоба на "не пишется", а не на "не компилится". Где-то нас на... обманули ;)

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


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

Вот и я такое помню, а в корневом посте жалоба на "не пишется", а не на "не компилится". Где-то нас на... обманули ;)

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

while(,,) как for(;;)

 

Но как признался автор, именно это он и хотел написать.

Виноват , сам уже потом понял. Я и раньше так писал, но забыл. Спасибо!

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


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

С запятыми в IAR AVR вообще интересная штука. Начиная с 4 версии в режиме С++ спокойно компилятором глотается запятая вместо классической точки запятой. Вопрос - это стандарт или особенность IAR. Оригинала стандарта под рукой нет.

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


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

Начиная с 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 не обидится на меня за цитирование без разрешения.

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


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

А если вне циклов, найдите отличия:

Классика:

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

 

Я имел в виду именно такой случай.

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


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

А если вне циклов, найдите отличия:

Я имел в виду именно такой случай.

Не вижу криминала. Использование оператора "запятая" в этом месте допустимо. Ваша запись представляет собой два выражения. В первом случае они разделены точками последовательности (sequence points), во втором случае - объединены оператором "запятая". В обоих случаях результаты этих выражений не используются, поэтому имеем идентичный сгенерированный код вычисления этих выражений.

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


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

А если вне циклов, найдите отличия:

Классика:

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" много лет назад.

Запятая - интересный и иногда очень удобный оператор, но писать его где попало из понту или "а чтобы была только одна ';' на строке" - это... Даже слов не нахожу.

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


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

Запятая - интересный и иногда очень удобный оператор, но писать его где попало из понту или "а чтобы была только одна ';' на строке" - это... Даже слов не нахожу.

 

Спасибо за разъяснения.

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


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

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

 

while(k=0, k<9, k++) sens[0][k]=0xff;

 

не происходило бы постоянное присваивание k=0?.. ведь даже если мы сделаем

 

while(k=0, k++, k<9) sens[0][k]=0xff;

 

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

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


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

(k=0, k<9, k++) - это все 0, т.е. инструкция не выполнится

(k=0, k<9, ++k) - а это будет 1

во втором случае бесконечный цикл.

 

while(k=0, k++, k<9) sens[0][k]=0xff;
- это тоже вечный цикл
Изменено пользователем CSB

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


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

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

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

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

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

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

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

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

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

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