В следующем коде
#include <iostream>
using namespace std;
int main(void){
double *x, *y;
unsigned long long int n=2;
x = new double [2];
y = new double [2];
for(int i=0; i<2; i++){
x[i] = 1.0;
y[i] = 1.0;
//what is the following line doing exaclty?
x[i] = y[i]/=((double)n);
cout << "\n" << x[i] << "\t" << y[i];
}
delete [] x;
delete [] y;
printf("\n");
return 0;
}
Я не понимаю, что такое сочетание =
а также /=
делает именно, и почему это разрешено (код компилируется и работает правильно под Valgrind).
Этот код
x[i] = y[i]/=((double)n);
логически эквивалентно этим двум строкам:
y[i]/=((double)n);
x[i] = y[i];
и первая строка логически равна:
y[i] = y[i] / n;
Примечание: приведение типов здесь полностью излишне.
Оба являются операторами присваивания, а операторы присваивания оцениваются справа налево. Поэтому (при условии, что n! = 0) комбинированное присваивание делает то же самое, что и это:
y[i] /= ((double)n);
x[i] = y[i];
И, конечно же, первое утверждение можно записать так:
y[i] = y[i] / ((double)n);
Следующие 2 символа: =
а также /=
являются операторами присваивания. Они используются для установки переменной справа к значению или переменной справа. =
оператор прост; он не работает с значением слева. Итак, если у нас есть утверждение вроде:
int x = 5;
Здесь оператор присваивания равенства просто устанавливает x в 5.
Второй оператор в строке кода, который вас смущает, является частью составной оператор присваивания группа. Этот оператор выполняет 2 операции: сначала он берет значение, сохраненное в переменной в левой части оператора, делит его на значение в правой части оператора и снова сохраняет его в переменной в левой части оператора. , Поэтому, если мы возьмем этот простой кусок кода:
int y = 25;
y /= 5;
Этот фрагмент кода объявляет переменную типа int, инициализированную в 25. Вторая строка делит значение y
на 5 объявление обновляет переменную y с результирующим значением математической операции.
Теперь мы не ограничены тем, чтобы иметь фиксированное значение, переменную или возвращаемое значение функции в качестве оператора в правой части оператора присваивания. Мы можем очень хорошо оценить выражение (как здесь мы делаем y[i] /= ((double)/n)
и затем назначьте обновленное значение y[i]
в x[i]
, Компилятор сначала просто вычисляет выражение справа, а затем переходит к присвоению его левой переменной.
Теперь, имея это объяснение, мы можем очень легко обобщить эту строку:
x[i] = y[i]/=((double)n);
Компилятор делит значение y[i]
значением n, приведенным к двойному числу (здесь не требуется y
сам имеет тип double), присваивает новое значение y[i]
, а затем назначает x[i]
обновленное значение y[i]
,