|
Помогите новичку, работа с массивами |
|
|
2 страниц
< 1 2
|
 |
Ответов
(15 - 28)
|
Jan 17 2008, 13:45
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Baser @ Jan 17 2008, 13:20)  Применение запятых в условии цикла while говорит о следующих друг за другом условиях. Нет, совсем нет. Результатом этих следующих друг за другом выражений будет значение последнего выражения. Именно результат k++ будет проверяться в цикле. Остальные два с тем же успехом можно было вынести из скобок в тело цикла. P.S. для меня конструкции с запятыми тоже нечто неестественное. ReAl их хорошо понимает и удачно использует.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 17 2008, 14:42
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(CSB @ Jan 17 2008, 15:56)  Возможно я не правильно понял что Вы имели ввиду под "результат k++", То, что понимают под этим K&R и стандарт языка С. Результатом выражения "k++" является значение k до выполнения этого выражения. То, что после этого выражения k увеличится на 1 - всего лишь "побочный эффект" этого выражения. Также как результатом выражения a = b является значение b, а тот факт, что после выполнения этого выражения то же самое значение оказывается в a - "побочный эффект", как бы парадоксально это не было  Вдруг подумалось - а как компилятор вообще пропустил конструкцию for(,,) и не выругался на отсутствие там ";"?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 17 2008, 17:25
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Сергей Борщ @ Jan 17 2008, 16:42)  Вдруг подумалось - а как компилятор вообще пропустил конструкцию for(,,) и не выругался на отсутствие там ";"? Не волнуйся, Сергей, на for(,,) компилятор ругается троекратно а while(,,) в общем случае допустимая конструкция.
|
|
|
|
|
Jan 17 2008, 17:53
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Baser @ Jan 17 2008, 19:25)  Не волнуйся, Сергей, на for(,,) компилятор ругается троекратно  Вот и я такое помню, а в корневом посте жалоба на "не пишется", а не на "не компилится". Где-то нас на... обманули
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 17 2008, 18:54
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(Сергей Борщ @ Jan 17 2008, 20:53)  Вот и я такое помню, а в корневом посте жалоба на "не пишется", а не на "не компилится". Где-то нас на... обманули  Это я ввел в заблуждение, мой глаз при быстром просмотре воспринял сстрочку while(,,) как for(;;) Но как признался автор, именно это он и хотел написать. Цитата(masterpc @ Jan 17 2008, 14:29)  Виноват , сам уже потом понял. Я и раньше так писал, но забыл. Спасибо!
|
|
|
|
|
Jan 18 2008, 09:04
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(VladimirYU @ Jan 18 2008, 07:58)  Начиная с 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 не обидится на меня за цитирование без разрешения.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 18 2008, 09:25
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
А если вне циклов, найдите отличия: Классика: 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
Я имел в виду именно такой случай.
|
|
|
|
|
Jan 18 2008, 10:49
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(VladimirYU @ Jan 18 2008, 11:25)  А если вне циклов, найдите отличия: Классика: 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-объекты), поэтому в итоге код вообще не генерируется.Цитата(VladimirYU @ Jan 18 2008, 11:25)  Я имел в виду именно такой случай. Этот? Цитата(VladimirYU @ Jan 18 2008, 07:58)  С запятыми в IAR AVR вообще интересная штука. Начиная с 4 версии в режиме С++ спокойно компилятором глотается запятая вместо классической точки запятой. Как уже написал Сергей - "запятая" столь же "классическая" в С, как и "точка с запятой" Если IAR более ранних версий указанные выше два примера (названных как "классика" и "запятая") компилировал в разный по действию код или ругался, то он был просто очень не прав. Так как эти варианты обязаны давать одинаковые действия и компилировались одинаково любым С-компилятором под "Электронику-60" много лет назад. Запятая - интересный и иногда очень удобный оператор, но писать его где попало из понту или "а чтобы была только одна ';' на строке" - это... Даже слов не нахожу.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 18 2008, 11:08
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(ReAl @ Jan 18 2008, 14:49)  Запятая - интересный и иногда очень удобный оператор, но писать его где попало из понту или "а чтобы была только одна ';' на строке" - это... Даже слов не нахожу. Спасибо за разъяснения.
|
|
|
|
|
Feb 5 2008, 19:09
|
Частый гость
 
Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088

|
Цитата (k=0, k<9, k++) - это все 0, т.е. инструкция не выполнится (k=0, k<9, ++k) - а это будет 1 во втором случае бесконечный цикл. Цитата while(k=0, k++, k<9) sens[0][k]=0xff; - это тоже вечный цикл
Сообщение отредактировал CSB - Feb 5 2008, 19:16
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|