|
Порядок выполнения операций. Вопрос зантокам! |
|
|
|
Nov 11 2009, 06:33
|

Частый гость
 
Группа: Свой
Сообщений: 130
Регистрация: 8-08-08
Из: Новосибирск
Пользователь №: 39 488

|
Что сделает компилятор увидев такой код: Код twi_write_data(0,ptr, data[ptr++]);
|
|
|
|
|
Nov 11 2009, 06:49
|

Частый гость
 
Группа: Свой
Сообщений: 130
Регистрация: 8-08-08
Из: Новосибирск
Пользователь №: 39 488

|
Цитата(HARMHARM @ Nov 11 2009, 12:45)  Сделает вызов функции. Если найдет соответствующий заголовок. Объясните свой вопрос. Зантоки и телепаты в отпуске. Допустип ptr==0, с какими параметрами будет вызвана функция twi_write_data()
|
|
|
|
|
Nov 11 2009, 07:32
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(igorenja @ Nov 11 2009, 10:33)  Что сделает компилятор увидев такой код: Код twi_write_data(0,ptr, data[ptr++]); Компилятор - скомпилирует. А вот что сделает программа - не определено, тк компиляторозависимо. Вобщем - бэдстайл
|
|
|
|
|
Nov 11 2009, 07:53
|

Частый гость
 
Группа: Свой
Сообщений: 107
Регистрация: 6-09-06
Из: Москва
Пользователь №: 20 118

|
Цитата(igorenja @ Nov 11 2009, 09:33)  Что сделает компилятор увидев такой код: Код 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
|
|
|
|
|
Nov 11 2009, 08:02
|

Частый гость
 
Группа: Свой
Сообщений: 130
Регистрация: 8-08-08
Из: Новосибирск
Пользователь №: 39 488

|
Цитата(LessNik @ Nov 11 2009, 13:53)  У меня выдаёт предупреждение: 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++;
|
|
|
|
|
Nov 11 2009, 09:45
|

читатель даташитов
   
Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999

|
Цитата(igorenja @ Nov 11 2009, 10:02)  Короче говоря единственно правильный вариант: Код twi_write_data(0,ptr, data[ptr]); ptr++; Вообще-то правильнее привыкнуть писать в таких местах ++ptr. Потому что ptr может оказаться сложным типом, при ptr++ может быть создана лишняя копия.
|
|
|
|
|
Nov 11 2009, 12:34
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(HARMHARM @ Nov 11 2009, 13:45)  Вообще-то правильнее привыкнуть писать в таких местах ++ptr. Потому что ptr может оказаться сложным типом, при ptr++ может быть создана лишняя копия. Кстати, да. Из той же серии - полезно писать for ( ...; ++clVariable_) Хотя, для части людей сложно поверить в то, что конструкции for (int i=0; i<10; ++i) и for (int i=0; i<10; i++) Функционально одинаковы, но первая - оптимальнее
|
|
|
|
|
Nov 11 2009, 12:47
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(esaulenka @ Nov 11 2009, 15:37)  HARMHARM, а можно пример? Не понимаю... надеюсь, ув. HARMHARM не будет против, если я отвечу  на пальцах - в случае постинкремента мы 1) изменяем состояние объекта 2) возвращаем предыдущее состояние объекта (вот для сохрения предыдущего состояния как раз и создается копия) в случае прединкремента мы 1) изменяем состояние объекта 2) возвращаем новое состояние - сохранять старое состояние объекта не требуется
|
|
|
|
|
Nov 11 2009, 12:55
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Цитата(Dima_G @ Nov 11 2009, 15:34)  Хотя, для части людей сложно поверить в то, что конструкции for (int i=0; i<10; ++i) и for (int i=0; i<10; i++) Функционально одинаковы, но первая - оптимальнее  Бред какой ... Только что проделал такое с VC 6. Результирующий exe-файл в обоих случаях идентичный (проверено тотал коммандером).
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Nov 11 2009, 13:04
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Никогда не задумывался... Но разве ptr++ - это не "сначала использовать переменную ptr, а потом её инкрементировать", а именно "создать копию, инкрементировать один экземпляр, а использовать другой" ? К тому же, на мой взгляд, i++ читается лучше, чем ++i. Во всяком случае, я когда вижу ++i, начинаю задумываться, зачем оно тут применяется
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|