【问题标题】:Clarification on /= operator澄清 /= 运算符
【发布时间】:2017-07-28 03:06:21
【问题描述】:

在下面的代码中

#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 下编译和运行正确)。

【问题讨论】:

  • 你知道/=是做什么的吗?
  • 分解为y[i] = y[i]/((double)n); x[i] = y[i];
  • 不要垃圾标签。 C 不是 C++。
  • @Ðаn: 对于一个编译时大小的数组std::array 可能是一个很多更好的主意。但在这种情况下,一个简单的double x[2] 也可以。这里没有理由涉及动态内存。
  • @Olaf 我正在扩展/=,但它还有什么意思?

标签: c++ operators compound-assignment


【解决方案1】:

这段代码

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

在逻辑上等同于这 2 行:

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

第一行逻辑上等于:

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

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

【讨论】:

    【解决方案2】:

    以下 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 本身是双精度类型),将新值分配给y[i],然后分配x[i] y[i] 的更新值。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-29
        • 1970-01-01
        • 2015-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多