|
WinAVR: странный warning, паранойя компилятора или тупость программиста? |
|
|
|
Jun 24 2009, 06:47
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
гм... я свое выражение понимаю так: 1. вычисляется выражение правее знака равенства: 1.1. увеличивается на 1 chanel 1.2. накладывается маска 7 на увеличенное значение. 2. результат заносится в chanel мне кажется, никакой неопределенности тут нет, другой порядок вычисления просто не может быть. да, chanel обновляется дважды, но где тут криминал? фактически это выражение эквивалентно такой цепочке: Код chanel++; chanel &= 7; не так ли? тут ведь тоже дважды происходит обновление chanel? P.S. 2 Модератор: зря перенесли тему... в том разделе aesok наверняка дал бы ответ в соответствии с логикой работы компилятора и стандартами, а сюда он, возможно, и не заглянет...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jun 24 2009, 07:06
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата фактически это выражение эквивалентно такой цепочке: Код chanel++; chanel &= 7; не так ли? тут ведь тоже дважды происходит обновление chanel? Нет. В этой цепочке порядок определен. В выражении же компилятору предоставлена большая свобода. Конкретных отсылок на стандарт дать не могу, но чую ЗЫ Если вам интересно, почему так, попробуйте спросить на rsdn - там тусуются знатоки стандарта. ЗЫЫ Но проще просто так не писать - есть значительно более прямой путь - chanel = (chanel + 1) & 7.
|
|
|
|
|
Jun 24 2009, 07:39
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(ukpyr @ Jun 24 2009, 11:23)  ++x и х++ выполняются до и после арифм.выражения. http://www.google.com/search?client=opera&...-8&oe=utf-8http://c-faq.com/expr/evalorder2.htmlпоэтому лучше не спорить с компилятором, и не расставлять себе и пользователям вашей программы (если такие будут) ненужных граблей. я с компилятором не спорю. я пытаюсь понять. на счет ++: я бы сказал, что ++Х изменяет переменную ДО, а Х++ ПОСЛЕ того, как ее значение будет использовано для вычисления выражения. и это не имеет никакого отношения к операции присваивания, которая ВСЕГДА выполняется ПОСЛЕ того, как ВСЕ ВЫРАЖЕНИЕ ЦЕЛИКОМ вычислено. в частности, в моем выражении инкремент переменной используется ОДИН раз и ссылки на проблему (++Х * Х++) тут некорректны, имхо. чисто логически я не усматриваю повода для warning-а, потому и хочу понять, в чем нюанс.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jun 24 2009, 07:46
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(ARV @ Jun 24 2009, 09:47)  P.S. 2 Модератор: зря перенесли тему... в том разделе aesok наверняка дал бы ответ в соответствии с логикой работы компилятора и стандартами, а сюда он, возможно, и не заглянет... Букварь, относительно sequence point Вы могли и сами самостоятельно прочитать. И сейчас все еще можете. Если не хотите, то размышлизмам на вольные темы место в разделе для начинающих. Ответ Вам дали практически сразу, не вина отвечающего, что Вы не желаете ознакомится и ВЫПОЛНЯТЬ правила вычисления выражений принятые в Cи и пытаетесь изобретать свои.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 24 2009, 07:55
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(ARV @ Jun 24 2009, 11:39)  на счет ++: я бы сказал, что ++Х изменяет переменную ДО, а Х++ ПОСЛЕ того, как ее значение будет использовано для вычисления выражения. и это не имеет никакого отношения к операции присваивания, которая ВСЕГДА выполняется ПОСЛЕ того, как ВСЕ ВЫРАЖЕНИЕ ЦЕЛИКОМ вычислено. Это не так. Почитайте например тут http://gcc.gnu.org/ml/gcc/2004-10/msg00027.html Там как раз ваш случай. Цитата оттуда: Цитата Basically the rule in C is that if you have an expression (remember that an assignment is just an expression), and somewhere in that expression, you use an increment operator on a variable, you can't mention that variable elsewhere in the expression. End of story. Цитата в частности, в моем выражении инкремент переменной используется ОДИН раз Это так, но когда он произойдет - до присваивания или после - большой вопрос. Насколько я понимаю, инкремент должен произойти до очередной точки следования, а = точкой следования не является
|
|
|
|
|
Jun 24 2009, 07:56
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
zltigo, я ждал вашего появления в теме. и был уверен, что вместо ответа на вопрос получу щелчок по носу. спасибо, вы очень помогли. пока все, что мне было сказано по существу - не выдерживает критики. в чем ущербность моих "измышлизмов"? перед тем, как присвоить переменной значение выражения, выражение должно быть вычислено? ДА. в выражении можно использовать значение самой обновляемой переменной? ДА. пост-инкремент или пре-инкремент допустим в выражении? ДА. существуют ли какие-то иные способы вычислить мое выражение, кроме как тот, что я озвучил? НЕТ. в чем же "опасность", которую видит компилятор?
если X++ * ++X вызывает противоречие с правилом математики, что от перестановки мест множителей произведение не меняется - тут все понятно. но порядок исполнения действий в моем выражениии по-моему однозначный.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jun 24 2009, 08:02
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(ARV @ Jun 24 2009, 10:56)  zltigo, я ждал вашего появления в теме. и был уверен, что вместо ответа на вопрос получу щелчок по носу. спасибо, вы очень помогли. 1. Сами накликали, однако! 2. Да, помог. Произнес два волшебных слова sequence point. Дальше, как говорится, Sapienti sat, он хлопнет себя по лбу и почитает стандарт, а не продолжит рассказывать... Цитата все, что мне было сказано по существу - не выдерживает критики.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 24 2009, 08:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(zltigo @ Jun 24 2009, 12:02)  1. Сами накликали, однако! 2. Да, помог. Произнес два волшебных слова sequence point. Дальше, как говорится, Sapienti sat. Sapienti sat - знающий ответ не задает вопросов. уж не знаю, как там это по-латыни... да и добавили вы свои "волшебные слова" после того, как я стал отвечать вам. я всегда считал, что тонущему надо кинуть спасательный круг, а не указать на него пальцем... и уж во всяком случае не ограничиться фразой "надо было учиться плавать". в этом заключается помощь, с моей точки зрения. но видимо, я ошибался. извините. адекватный человек Непомнящий Евгений, не страдающий лаконичностью чрезмерно, сказал в сущности то же самое, что и вы, однако я говорю ему спасибо за помощь без всякой иронии.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jun 24 2009, 11:42
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(demiurg_spb @ Jun 24 2009, 13:56)  Я в своё время пытался так делать, но тоже отказался от этого - не все компиляторы едят это молча  Код ++chanel &= 7; а зачем? ИМХО, самый прямой путь - chanel = (chanel+1) & 7. Единственное преимущество вашего кода - экономия символов. Зато его хрен поймешь...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|