-4

In the following code

#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;

}

I do not understand what the combination of = and /= is doing exactly, and why this is allowed (the code compiles and runs correctly under Valgrind).

4

3 回答 3

4

这段代码

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

在逻辑上等同于这 2 行:

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

第一行在逻辑上等于:

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

注意这里的类型转换是完全多余的。

于 2017-03-07T19:07:26.160 回答
2

以下 2 个符号:=/=是赋值运算符。它们用于将右侧的变量设置为右侧的值或变量。=操作简单;它不对左边的值做任何操作。所以,如果我们有这样的声明:

int x = 5;

这里的相等赋值运算符只是将 x 设置为 5。

您感到困惑的代码行中的第二个运算符是复合赋值运算符组的一部分。这个操作符做了2个操作:它首先取操作符左侧变量中存储的值,除以操作符右侧的值,然后再次将其存储到操作符左侧的变量中. 因此,如果我们采用这段简单的代码:

int y = 25;
y /= 5;

这段代码声明了一个 int 类型的变量,初始化为 25。第二行将 的值y除以 5,ad 用数学运算的结果值更新变量 y。

现在,我们不限于将固定值、变量或函数的返回值作为赋值运算符右侧的语句。我们可以很好地评估一个表达式(就像这里我们做的那样y[i] /= ((double)/n),然后将更新后的值分配给y[i]to x[i]。编译器只是首先评估右侧的表达式,然后将其分配给左侧的变量。

现在,有了这个解释,我们可以很容易地总结这一行:

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

编译器将 的值除以y[i]n 值,转换为双精度型(此处不需要,因为y它本身是双精度类型),将新值分配给y[i],然后分配x[i]的更新值y[i]

于 2017-03-07T23:01:23.057 回答
1

两者都是赋值运算符,赋值运算符是从右到左计算的。因此(假设 n != 0)组合分配与此相同:

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

当然,第一条语句也可以写成:

y[i] = y[i] / ((double)n);
于 2017-03-07T19:07:37.617 回答