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

Поиск:

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


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


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

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



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

vinter, давайте для начала проведем эксперемент.. у Вас VS ? что дает  нижеприведенный код ?
Код

int a2=5; int a1=5;
int b= --a1 + a1;
int c= a2 + --a2;
std::cout << b<< " "<< c<< std::endl;




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


Explorer
****


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

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



Цитата(mes @  19.2.2009,  23:34 Найти цитируемый пост)
у Вас VS ?

ага

Цитата(mes @  19.2.2009,  23:34 Найти цитируемый пост)
что дает  нижеприведенный код ?

то, что и должен 8 8

mes, нет тут UB.


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


Опытный
**


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

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



Всем спасибо за помощь!

PM MAIL ICQ   Вверх
mes
Дата 20.2.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vinter @  20.2.2009,  05:17 Найти цитируемый пост)
то, что и должен 8 8

т.е каждое слагаемое расценивалось как 4 ? 
не будем сейчас задаваться вопросом о правильности результата,
просто немного усложним пример :
Код

int b= --a1 + a1*2; 
int c= a2*2 + --a2;
// gcc : 12 14 

Код

int b= --a1 + a1/2;
int c= a1/2 + --a2;
//gcc: 6 6

что теперь получается и как это объяснить ?


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


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


depict1
****


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

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



Цитата(mes @  20.2.2009,  12:25 Найти цитируемый пост)
что теперь получается и как это объяснить ?

можно сделать вывод, что в первую очередь вычисляются подвыражения, содержащие префиксную форму декремента.
хотя я думал, что порядок вычисления подвыражений не определён...



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


Explorer
****


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

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



Цитата(mes @  20.2.2009,  13:25 Найти цитируемый пост)
 как это объяснить ?

приоритетом операций  smile

Добавлено через 53 секунды
Цитата(zim22 @  20.2.2009,  13:52 Найти цитируемый пост)
что порядок вычисления подвыражений не определён...

четко определен приоритетами.


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


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


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

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



Цитата(vinter @  20.2.2009,  12:16 Найти цитируемый пост)

приоритетом операций  

т.е у "* " и "/" разные приорететы по отношению к  "--" ?



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


depict1
****


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

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



У меня в книжечке написано, что :
"За исключением логических операторов AND и OR, порядок вычисления парных операторов остается неопределенным, что обеспечивает компилятору свободу оптимизации кода."
Код

// Упс! Язык не определяет порядок обработки
if (ia[index++] < ia[index])



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


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


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

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



Цитата(zim22 @  20.2.2009,  12:28 Найти цитируемый пост)
if (ia[index++] < ia[index])

о! хороший пример  smile как раз по нашей теме, о кол-ве изменений в точке следования smile
демонстрация гораздо нагляднее )


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


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


Explorer
****


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

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



Цитата(mes @  20.2.2009,  14:24 Найти цитируемый пост)
т.е у "* " и "/" разные приорететы по отношению к  "--" ?

mes, вот чесное слово устал ты уже, открой таблицу приоритетов.. префиксный -- приоритетней всех арифметических операций.
Мне больше тут нечего сказать.


Цитата(mes @  20.2.2009,  14:37 Найти цитируемый пост)
о! хороший пример   как раз по нашей теме, о кол-ве изменений в точке следования 

это unspecified behavior, чувствуешь разницу с undefined?  smile 


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


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


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

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



..

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


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


Explorer
****


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

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



mes, значит в  gcc баг, VS выдает все как должно быть

Добавлено через 1 минуту и 5 секунд
а попробуй так
Код

int b= (--a1) + (a1*2); 
int c= a2*2 + (--a2);

это абсолютный эквивалент твоей записи


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


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


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

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



Цитата(vinter @  20.2.2009,  16:43 Найти цитируемый пост)
mes, вот чесное слово устал ты уже, открой таблицу приоритетов.. префиксный -- приоритетней всех арифметических операций.
Мне больше тут нечего сказать.

ну вот последний пример  :
Код

// gcc :
{ 
int a=1, b=1;
cout << a + (b - b) + ++a << endl; // 4
}{
int a=1, b=1;
cout << a + b - b + ++a << endl; // 3
}

интересно как в данном примере сказывается приоритет опeраций на разном результате ?

Добавлено через 3 минуты и 24 секунды
Цитата(vinter @  20.2.2009,  16:52 Найти цитируемый пост)
а попробуй так

результат как и прежде

Добавлено через 11 минут и 56 секунд
Цитата(vinter @  20.2.2009,  16:43 Найти цитируемый пост)
то unspecified behavior, чувствуешь разницу с undefined?  smile 

не очень.. smile 


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


Explorer
****


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

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



Цитата(mes @  20.2.2009,  19:23 Найти цитируемый пост)
интересно как в данном примере сказывается приоритет опeраций на разном результате ?


mes, как мне кажется gcc бажит, VC в обоих 4 выдает.

Цитата(mes @  20.2.2009,  19:23 Найти цитируемый пост)
результат как и прежде

Цитата(vinter @  20.2.2009,  18:52 Найти цитируемый пост)
значит в  gcc баг


Цитата(mes @  20.2.2009,  19:23 Найти цитируемый пост)
не очень.. 

я не понимаю как ссылку выложить на rsdn :(, короче сделаем относительный путь: rsdn\C++\deepC++
там найдешь, там статей не много.


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


Гентозавр
****


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

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



Цитата(vinter @  20.2.2009,  16:52 Найти цитируемый пост)
int b= (--a1) + (a1*2); 

ИМХО это - UB, а1 читается 2 раза и изменяется 1 раз между точками следования, результат зависит от того, когда запишется изменение.
А gcc с -Wall кстати ворнинг выдаёт:
Код

bla.cpp:19: warning: operation on ‘a1’ may be undefined



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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