Пояснение к оператору / =

В следующем коде

#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).

-5

Решение

Этот код

 x[i] = y[i]/=((double)n);

логически эквивалентно этим двум строкам:

 y[i]/=((double)n);
x[i] = y[i];

и первая строка логически равна:

 y[i] = y[i] / n;

Примечание: приведение типов здесь полностью излишне.

4

Другие решения

Оба являются операторами присваивания, а операторы присваивания оцениваются справа налево. Поэтому (при условии, что n! = 0) комбинированное присваивание делает то же самое, что и это:

y[i] /= ((double)n);
x[i] = y[i];

И, конечно же, первое утверждение можно записать так:

y[i] = y[i] / ((double)n);
1

Следующие 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],

1
По вопросам рекламы [email protected]