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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Порядок выполнения операций. Вопрос зантокам!
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
HARMHARM
сообщение Nov 11 2009, 06:45
Сообщение #2


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

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



Сделает вызов функции. Если найдет соответствующий заголовок.
Объясните свой вопрос. Зантоки и телепаты в отпуске.
Go to the top of the page
 
+Quote Post
igorenja
сообщение Nov 11 2009, 06:49
Сообщение #3


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

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



Цитата(HARMHARM @ Nov 11 2009, 12:45) *
Сделает вызов функции. Если найдет соответствующий заголовок.
Объясните свой вопрос. Зантоки и телепаты в отпуске.



Допустип ptr==0, с какими параметрами будет вызвана функция twi_write_data()
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Nov 11 2009, 07:32
Сообщение #4


Местный
***

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



Цитата(igorenja @ Nov 11 2009, 10:33) *
Что сделает компилятор увидев такой код:
Код
twi_write_data(0,ptr, data[ptr++]);


Компилятор - скомпилирует. А вот что сделает программа - не определено, тк компиляторозависимо.
Вобщем - бэдстайл
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 11 2009, 07:50
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
LessNik
сообщение Nov 11 2009, 07:53
Сообщение #6


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

Группа: Свой
Сообщений: 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
Сообщение #7


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

Группа: Свой
Сообщений: 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
_Pasha
сообщение Nov 11 2009, 08:24
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата
Never rely on argument's order.

Такую татуировку на лоб обычно рекомендуют сделать экспериментаторам.
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Nov 11 2009, 09:45
Сообщение #9


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

Группа: Свой
Сообщений: 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
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 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
esaulenka
сообщение Nov 11 2009, 12:37
Сообщение #11


Профессионал
*****

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



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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Nov 11 2009, 12:47
Сообщение #12


Местный
***

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



Цитата(esaulenka @ Nov 11 2009, 15:37) *
HARMHARM, а можно пример?
Не понимаю...


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

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

в случае прединкремента мы
1) изменяем состояние объекта
2) возвращаем новое состояние - сохранять старое состояние объекта не требуется
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 11 2009, 12:51
Сообщение #13


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

Сообщение отредактировал GetSmart - Nov 11 2009, 12:51


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Demeny
сообщение Nov 11 2009, 12:55
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 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
esaulenka
сообщение Nov 11 2009, 13:04
Сообщение #15


Профессионал
*****

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



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

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

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:54
Рейтинг@Mail.ru


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