реклама на сайте
подробности

 
 
> Порядок выполнения операций. Вопрос зантокам!
igorenja
сообщение Nov 11 2009, 06:33
Сообщение #1


Частый гость
**

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



Что сделает компилятор увидев такой код:
Код
twi_write_data(0,ptr, data[ptr++]);
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
LessNik
сообщение Nov 11 2009, 07:53
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
igorenja
сообщение Nov 11 2009, 08:02
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 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++;
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Nov 11 2009, 09:45
Сообщение #4


читатель даташитов
****

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



Цитата(igorenja @ Nov 11 2009, 10:02) *
Короче говоря единственно правильный вариант:
Код
twi_write_data(0,ptr, data[ptr]);
ptr++;

Вообще-то правильнее привыкнуть писать в таких местах ++ptr. Потому что ptr может оказаться сложным типом, при ptr++ может быть создана лишняя копия.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Nov 11 2009, 12:34
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 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++)
Функционально одинаковы, но первая - оптимальнее biggrin.gif
Go to the top of the page
 
+Quote Post
Demeny
сообщение Nov 11 2009, 12:55
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 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++)
Функционально одинаковы, но первая - оптимальнее biggrin.gif

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


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Nov 11 2009, 16:15
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(Demeny @ Nov 11 2009, 16:55) *
Бред какой ...
Только что проделал такое с VC 6. Результирующий exe-файл в обоих случаях идентичный (проверено тотал коммандером).


Потому, что умный компилятор соптимизировал. Но не слишком надейтесь на то, что так будет всегда. Попробуйте проверить с объектом класса с определенным оператором пост и прединкремента
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- igorenja   Порядок выполнения операций. Вопрос зантокам!   Nov 11 2009, 06:33
- - HARMHARM   Сделает вызов функции. Если найдет соответствующий...   Nov 11 2009, 06:45
|- - igorenja   Цитата(HARMHARM @ Nov 11 2009, 12:45) Сде...   Nov 11 2009, 06:49
- - Dima_G   Цитата(igorenja @ Nov 11 2009, 10:33) Что...   Nov 11 2009, 07:32
- - GetSmart   Так писать ИМХО не рекомендуется. А вообще, умный ...   Nov 11 2009, 07:50
||- - GetSmart   Цитата(Dima_G @ Nov 11 2009, 22:15) ...Но...   Nov 11 2009, 16:28
|||- - Dima_G   Цитата(GetSmart @ Nov 11 2009, 20:28) В 2...   Nov 11 2009, 16:32
||- - zltigo   Цитата(Dima_G @ Nov 11 2009, 19:15) Потом...   Nov 11 2009, 17:41
||- - Dima_G   Цитата(zltigo @ Nov 11 2009, 20:41) А дур...   Nov 12 2009, 04:31
|- - defunct   Цитата(igorenja @ Nov 11 2009, 10:02) Кор...   Nov 13 2009, 13:46
- - _Pasha   ЦитатаNever rely on argument's order. Такую та...   Nov 11 2009, 08:24
- - esaulenka   HARMHARM, а можно пример? Не понимаю...   Nov 11 2009, 12:37
|- - Dima_G   Цитата(esaulenka @ Nov 11 2009, 15:37) HA...   Nov 11 2009, 12:47
- - GetSmart   Эта особенность инкремента была актуальна в прошло...   Nov 11 2009, 12:51
- - esaulenka   Никогда не задумывался... Но разве ptr++ - это не...   Nov 11 2009, 13:04
- - GetSmart   Кстати, во FreeRTOS встречаются оба варианта инкре...   Nov 12 2009, 07:22
- - Flexz   FreeRTOS просто, видимо, разные люди пишут У Стр...   Nov 12 2009, 07:56
- - HARMHARM   Цитата(Flexz @ Nov 12 2009, 09:56) FreeRT...   Nov 12 2009, 07:58
- - Dima_G   Цитата(Flexz @ Nov 12 2009, 11:56) У Стра...   Nov 12 2009, 08:00
- - _Pasha   Цитата(Dima_G @ Nov 12 2009, 12:00) Но ли...   Nov 12 2009, 15:32
- - Dima_G   Цитата(_Pasha @ Nov 12 2009, 19:32) Ладно...   Nov 13 2009, 03:18
- - _Pasha   Цитата(Dima_G @ Nov 13 2009, 06:18) Чет...   Nov 14 2009, 01:22


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 04:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01447 секунд с 7
ELECTRONIX ©2004-2016