IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> pow(), C++
sheka
сообщение 7.10.2011 22:44
Сообщение #1


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


pow() некорректно работает если используется инкремент или декремент в его параметрах.
Задание:
Совершая обход так:
1 3 4 10
2 5 9 11
6 8 12 15
7 13 14 16
заполнить матрицу а такими значениями: b11b12...bnn
Kod (Показать/Скрыть)

В таком исполнении pow(b[k++ / N], k % N + 1); работает так как надо (еще недавно и так не работал, но теперь почему-то работает):
результат (Показать/Скрыть)

а в таком pow(b[k / N], ++k % N + 1); - нет:
результат (Показать/Скрыть)


Сообщение отредактировано: sheka - 8.10.2011 0:02
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
IUnknown
сообщение 8.10.2011 1:23
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Ты на самом деле думаешь, что оба эти фрагмента делают одно и то же? Вынужден тебя разочаровать, это не так. Вот тебе простейший тест, доказывающий это:

1) добавляешь небольшую функцию, по имени pow, которая не только вычисляет значение xy, но еще и печатает, для каких аргументов она сработала:
int pow(int x, int y)
{
cout << "pow : x = " << x << " y = " << y << endl;
return std::pow(x, y);
}

, больше в коде ничего менять не надо, тебе и так будет понятно что произойдет дальше.

Итак. Запускаем с pow(b[k++ / N], k % N + 1)
Результат (Показать/Скрыть)

А теперь - запускаем с pow(b[k / N], ++k % N + 1)
Результат (Показать/Скрыть)


И что, ты по-прежнему считаешь, что глючит pow? Может, не надо извращаться при вычислении параметров и добиваться UB (неопределенного поведения), чего ты как раз и добился? Поведение не определено, в зависимости от компилятора, фазы Луны и погоды на Сатурне будут выдаваться разные результаты.

P.S. Кстати, компилятор же предупреждает тебя, что в коде не все в порядке:
In function 'int main()':
main.cpp (24) warning: operation on 'k' may be undefined
main.cpp (27) warning: operation on 'k' may be undefined
=== Build finished: 0 errors, 2 warnings (0 minutes, 1 seconds) ===

Неужели это не наводит на размышления? Или опять не обращаем внимания на предупреждения?


Сообщение отредактировано: IUnknown - 8.10.2011 1:31
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.06.2025 15:49
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"