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

Порядок выполнения операций. Вопрос зантокам!

Сделает вызов функции. Если найдет соответствующий заголовок.

Объясните свой вопрос. Зантоки и телепаты в отпуске.

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


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

Сделает вызов функции. Если найдет соответствующий заголовок.

Объясните свой вопрос. Зантоки и телепаты в отпуске.

 

 

Допустип ptr==0, с какими параметрами будет вызвана функция twi_write_data()

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


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

Что сделает компилятор увидев такой код:

twi_write_data(0,ptr, data[ptr++]);

 

Компилятор - скомпилирует. А вот что сделает программа - не определено, тк компиляторозависимо.

Вобщем - бэдстайл

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


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

Так писать ИМХО не рекомендуется. А вообще, умный компилятор на такое должен выдавать варнинг, аналогичный как при чтении двух и более волатильных переменных в одной операции.

 

ЗЫ. На форуме уже была оч похожая тема, но там был прикол с присвоением выражения толи ++n, толи n++.

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


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

Что сделает компилятор увидев такой код:

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

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


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

У меня выдаёт предупреждение:

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++;

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


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

Never rely on argument's order.

Такую татуировку на лоб обычно рекомендуют сделать экспериментаторам.

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


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

Короче говоря единственно правильный вариант:

twi_write_data(0,ptr, data[ptr]);
ptr++;

Вообще-то правильнее привыкнуть писать в таких местах ++ptr. Потому что ptr может оказаться сложным типом, при ptr++ может быть создана лишняя копия.

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


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

Вообще-то правильнее привыкнуть писать в таких местах ++ptr. Потому что ptr может оказаться сложным типом, при ptr++ может быть создана лишняя копия.

 

Кстати, да.

Из той же серии - полезно писать

for ( ...; ++clVariable_)

 

Хотя, для части людей сложно поверить в то, что конструкции

for (int i=0; i<10; ++i)

и

for (int i=0; i<10; i++)

Функционально одинаковы, но первая - оптимальнее :biggrin:

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


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

HARMHARM, а можно пример?

Не понимаю...

 

надеюсь, ув. HARMHARM не будет против, если я отвечу :)

 

на пальцах - в случае постинкремента мы

1) изменяем состояние объекта

2) возвращаем предыдущее состояние объекта (вот для сохрения предыдущего состояния как раз и создается копия)

 

в случае прединкремента мы

1) изменяем состояние объекта

2) возвращаем новое состояние - сохранять старое состояние объекта не требуется

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


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

Эта особенность инкремента была актуальна в прошлом веке. Особенно для AVR. Приличные компиляторы (ARM) вне зависимости от варианта инкремента делают одинаковый по размеру и скорости код. Так что не актуально.

Изменено пользователем GetSmart

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


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

Хотя, для части людей сложно поверить в то, что конструкции

for (int i=0; i<10; ++i)

и

for (int i=0; i<10; i++)

Функционально одинаковы, но первая - оптимальнее :biggrin:

Бред какой ...

Только что проделал такое с VC 6. Результирующий exe-файл в обоих случаях идентичный (проверено тотал коммандером).

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


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

Никогда не задумывался...

 

Но разве ptr++ - это не "сначала использовать переменную ptr, а потом её инкрементировать", а именно "создать копию, инкрементировать один экземпляр, а использовать другой" ?

 

К тому же, на мой взгляд, i++ читается лучше, чем ++i. Во всяком случае, я когда вижу ++i, начинаю задумываться, зачем оно тут применяется :)

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


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

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

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

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

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

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

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

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

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

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