Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> С++ неверно высчитывает значение функции, Или я недочитал теории :) 
V
    Опции темы
Ground
Дата 19.2.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 27.2.2006
Где: Комсомольск

Репутация: нет
Всего: 1



Вообщем проблемка у меня следующего характера. Есть код:
Код

int a=5, x=2;
a = ( a-- | x<<2 ) & (a<<2);
printf("%d\n", a);

Если я считаю вручную это выражение, то получается (0100 | 1000) & (10100) = 01100 & 10100 = 100 = 4. Если проверяю все это выражение в C++ получается 3. Если по частям, то левая часть равна 12, правая 20, 12 & 20 = 4.

В чем тут загвоздка?  smile
PM MAIL ICQ   Вверх
Sartorius
Дата 19.2.2009, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 2
Всего: 37



a-- уменьшит a на 1 но значение этого выражения - a до изменения. Т.е 5. Да и в правой части логического умножения a уже изменено

Это сообщение отредактировал(а) Sartorius - 19.2.2009, 17:23
PM MAIL ICQ   Вверх
Lazin
Дата 19.2.2009, 17:32 (ссылка) |    (голосов:7) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



это undefined behavior
PM MAIL Skype GTalk   Вверх
Kurganec
Дата 19.2.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 6.6.2008
Где: СПБ

Репутация: нет
Всего: нет



мне кажется дело в постфиксе "--"

попробуй так:
Код

--a;


PM MAIL ICQ Skype   Вверх
vinter
Дата 19.2.2009, 18:59 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



KurganecLazin дал вполне однозначный ответ


--------------------
Мой блог
PM MAIL WWW   Вверх
cutwater
Дата 19.2.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



Извините за глупый вопрос. Почему именно undefined behaviour?


--------------------
user posted image
PM MAIL   Вверх
Dem_max
Дата 19.2.2009, 19:57 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



лучше так
Код

a = ( (a--) | (x<<2) ) & (a<<2);



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mes
Дата 19.2.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(cutwater @  19.2.2009,  18:38 Найти цитируемый пост)
Извините за глупый вопрос. Почему именно undefined behaviour? 


попробуйте (мысленно) понаблюдать  за поведением этого примера
Код

a= --a1 + a2; //1
a= а2 +  --a2; //2

при таком вступление
Код

int a =5;
int a1=a;
int a2=a;

и таком :
Код

int a =5;
int& a1=a;
int& a2=a;

во втором случае этот код альтернативен следующему
Код

a= --a + a; //1
a= а +  --a; //2

результат которого зависит от факторов трансляции выражения и по стандарту не определен.

Это сообщение отредактировал(а) mes - 19.2.2009, 20:20


--------------------
PM MAIL WWW   Вверх
mes
Дата 19.2.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Dem_max @  19.2.2009,  18:57 Найти цитируемый пост)
лучше так    
a = ( (a--) | (x<<2) ) & (a<<2);

 smile неа..проблема с UB не из за скобок..

если судить потому, чего хотел получить в результате тс:
Цитата(Ground @  19.2.2009,  16:13 Найти цитируемый пост)

Если я считаю вручную это выражение, то получается (0100 | 1000) & (10100) = 01100 & 10100 = 100 = 4.

то лучше  так :
Код

a = ((a-1) | x<<2) & a<<2;


Это сообщение отредактировал(а) mes - 19.2.2009, 20:21


--------------------
PM MAIL WWW   Вверх
cutwater
Дата 19.2.2009, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



mes, благодарю за разъяснение. 


--------------------
user posted image
PM MAIL   Вверх
vinter
Дата 19.2.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(cutwater @  19.2.2009,  20:38 Найти цитируемый пост)
Извините за глупый вопрос. Почему именно undefined behaviour?

дополню меса: тут два изменения одной переменной в одной точке следования, по стандарту это UB.


--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 19.2.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(vinter @  19.2.2009,  19:39 Найти цитируемый пост)
тут два изменения одной переменной в одной точке следования

что то изменение я нашел только одно... smile 


Это сообщение отредактировал(а) mes - 19.2.2009, 21:33


--------------------
PM MAIL WWW   Вверх
vinter
Дата 19.2.2009, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(mes @  19.2.2009,  22:33 Найти цитируемый пост)
что то изменение я нашел только одно... 

1. a = expression
2. a--

Добавлено через 3 минуты и 51 секунду
Цитата(mes @  19.2.2009,  21:02 Найти цитируемый пост)
факторов трансляции выражения и по стандарту не определен.

это кстати не верно, последовательность вычислений тут вообще не причем, тут все проблемы с sequence points


--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 19.2.2009, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(vinter @  19.2.2009,  20:45 Найти цитируемый пост)
1. a = expression
2. a--

т.е
Код

 int b= --a + a; 

уже не UB ?  smile 


Цитата(vinter @  19.2.2009,  20:45 Найти цитируемый пост)

это кстати не верно, последовательность вычислений тут вообще не причем, тут все проблемы с sequence points 

a кто говорил о причинности в последовательности вычислений ? зависимость от последовательности приводилось лишь для более легкого понимания данной проблемы.
да проблема с sequence points , но достаточно одного изменения и двойного использования этого значения в одной точке следования  smile 





Это сообщение отредактировал(а) mes - 19.2.2009, 22:07


--------------------
PM MAIL WWW   Вверх
vinter
Дата 19.2.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(mes @  19.2.2009,  23:05 Найти цитируемый пост)
уже не UB ?  

не UB

Цитата(mes @  19.2.2009,  23:05 Найти цитируемый пост)
 но достаточно одного изменения и двойного использования этого значения в одной точке следования  

нет


--------------------
Мой блог
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0621 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.