igorenja 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба Что сделает компилятор увидев такой код: twi_write_data(0,ptr, data[ptr++]); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HARMHARM 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба Сделает вызов функции. Если найдет соответствующий заголовок. Объясните свой вопрос. Зантоки и телепаты в отпуске. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorenja 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба Сделает вызов функции. Если найдет соответствующий заголовок. Объясните свой вопрос. Зантоки и телепаты в отпуске. Допустип ptr==0, с какими параметрами будет вызвана функция twi_write_data() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DimaG 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба Что сделает компилятор увидев такой код: twi_write_data(0,ptr, data[ptr++]); Компилятор - скомпилирует. А вот что сделает программа - не определено, тк компиляторозависимо. Вобщем - бэдстайл Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба Так писать ИМХО не рекомендуется. А вообще, умный компилятор на такое должен выдавать варнинг, аналогичный как при чтении двух и более волатильных переменных в одной операции. ЗЫ. На форуме уже была оч похожая тема, но там был прикол с присвоением выражения толи ++n, толи n++. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LessNik 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба Что сделает компилятор увидев такой код: twi_write_data(0,ptr, data[ptr++]); У меня выдаёт предупреждение: Warning[Pa081]: undefined behavior: the order of read and modification of variable "ptr" (or a value reached by some form of indirection through it) is undefined in this statement Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorenja 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба У меня выдаёт предупреждение: Warning[Pa081]: undefined behavior: the order of read and modification of variable "ptr" (or a value reached by some form of indirection through it) is undefined in this statement Мой ИАР 4.41 скомпилировал и не выдал ни каких продупреждений. В итоге работало это вот так: twi_write_data(0,ptr+1, data[ptr]); На запись: twi_write_data(0,ptr++, data[ptr]); выдаёт предупреждение... Короче говоря единственно правильный вариант: twi_write_data(0,ptr, data[ptr]); ptr++; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба Never rely on argument's order. Такую татуировку на лоб обычно рекомендуют сделать экспериментаторам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HARMHARM 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба Короче говоря единственно правильный вариант: twi_write_data(0,ptr, data[ptr]); ptr++; Вообще-то правильнее привыкнуть писать в таких местах ++ptr. Потому что ptr может оказаться сложным типом, при ptr++ может быть создана лишняя копия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DimaG 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба Вообще-то правильнее привыкнуть писать в таких местах ++ptr. Потому что ptr может оказаться сложным типом, при ptr++ может быть создана лишняя копия. Кстати, да. Из той же серии - полезно писать for ( ...; ++clVariable_) Хотя, для части людей сложно поверить в то, что конструкции for (int i=0; i<10; ++i) и for (int i=0; i<10; i++) Функционально одинаковы, но первая - оптимальнее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба HARMHARM, а можно пример? Не понимаю... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DimaG 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба HARMHARM, а можно пример? Не понимаю... надеюсь, ув. HARMHARM не будет против, если я отвечу :) на пальцах - в случае постинкремента мы 1) изменяем состояние объекта 2) возвращаем предыдущее состояние объекта (вот для сохрения предыдущего состояния как раз и создается копия) в случае прединкремента мы 1) изменяем состояние объекта 2) возвращаем новое состояние - сохранять старое состояние объекта не требуется Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 (изменено) · Жалоба Эта особенность инкремента была актуальна в прошлом веке. Особенно для AVR. Приличные компиляторы (ARM) вне зависимости от варианта инкремента делают одинаковый по размеру и скорости код. Так что не актуально. Изменено 11 ноября, 2009 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Demeny 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба Хотя, для части людей сложно поверить в то, что конструкции for (int i=0; i<10; ++i) и for (int i=0; i<10; i++) Функционально одинаковы, но первая - оптимальнее Бред какой ... Только что проделал такое с VC 6. Результирующий exe-файл в обоих случаях идентичный (проверено тотал коммандером). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба Никогда не задумывался... Но разве ptr++ - это не "сначала использовать переменную ptr, а потом её инкрементировать", а именно "создать копию, инкрементировать один экземпляр, а использовать другой" ? К тому же, на мой взгляд, i++ читается лучше, чем ++i. Во всяком случае, я когда вижу ++i, начинаю задумываться, зачем оно тут применяется :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться