HI allВозник вопрос. Читаю очень интересную книгу "Священные знания с++ " на стр.34
столкнулся со следующей проблемой.
Дана функция, задающая конкретный элемент двумерного массива
inline void foo(float *a, int m, int i, int j) {
a[i*m+j] = a[i*m+j] * a[i*m+j] + a[i*m+j]; /// ошибка
}так же имеется реализация этой функции со ссылкой
inline void foo(float *a, int m, int i, int j) {
float &r = a[i*m + j ];
r= r *r +r;
}Так вот в книге сказано что в первом случае есть ошибка.
Не могу понять какая ?Ps: Сильно не пинать
>inline void foo(float *a, int m, int i, int j) {
> a[i*m+j] = a[i*m+j] * a[i*m+j] + a[i*m+j]; /// ошибка
>}
>inline void foo(float *a, int m, int i, int j) {
> float &r = a[i*m + j ];
> r= r *r +r;
>}
>Так вот в книге сказано что в первом случае есть ошибка.
>Не могу понять какая ?ыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыы)))
все просто до безобразия, вы читаете книгу на русском с кучей ошибок перевода и еще самовольными изменениями переводчика =))
вот как выглядит строка в оригинале:
a[i*m+j] = a[i*m+j] * a[i*m+i] + a[i*m+j];
внимание на индексы, второй множитель в оригинале с индесом i*m+i вместо i*m+j, поэтому читатель русской версии книги и не вдупляет т.к. переводчик самовольно поправил код :))а в оригинале автор переходя к использованию ссылки показывает что таким образом можно:
1. предохраниться от подобных ошибок
2. "соптимизировать" чутка. во втором случае вместо четырехкратного вычисления индекса и обращения к элементу массива это делается один раз при инициализации ссылки. Надеюсь понятно почему в кавычках? ;)
3. элегантно отделил алгоритм функции от синтаксического мусора доступа к элементу массива. т.е. выделил важное.
0. автор мог бы пойти дальше и написать r += r * r; для полного счастья :))
Спасибо