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; } Так вот в книге сказано что в первом случае есть ошибка. Не могу понять почему необходимо использовать ссылку? Вот это же на языке оригинала Consider the following function that sets a particular element of a two-dimensional array: 1. inline void set_2d( float *a, int m, int i, int j ) { 2. a[i*m+j] = a[i*m+j] * a[i*m+j] + a[i*m+j]; // oops! 3. } 4. We can replace the line commented 'oops!' with a simpler version that employs a reference. 1. inline void set_2d( float *a, int m, int i, int j ) { 2. float &r = a[i*m+j]; 3. r = r*r+r; 4. } 5.
reddrak Дело было так. Автор оригинального первого издания написал первый код так: inline void set_2d( float *a, int m, int i, int j ) { a[i*m+j] = a[i*m+j] * a[i*m+i] + a[i*m+j]; // oops } т.е. во втором слагаемом он специально перепутал j на i. Второй код он привел как более красивый, понятный и очевидный вариант, в котором, в отличии от первого, трудно ошибится. (Если заменить второй член на a[i*m+j], то он будет тоже правильный.) А русский перевод - это отдельная тема, там опечатка на опечатке - и это одна из них. Переводчик не понял оригинального автора и все. Кстати, это уже где-то обсуждалось, и не только русский перевод ошибочный, поэтому - читайте оригинал.