在以下代码中
Year_1 = 2017 'integer
Day_1 = 1 'integer
Date_from_userform = CDate(Year_1 & "-" & UserForm1.ComboBox1.Value & "-" & Day_1) 'date
我不明白#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下编译并正确运行)。
答案 0 :(得分:4)
此代码
x[i] = y[i]/=((double)n);
在逻辑上等同于这2行:
y[i]/=((double)n);
x[i] = y[i];
并且第一行在逻辑上等于:
y[i] = y[i] / n;
注意这里的类型转换完全是多余的。
答案 1 :(得分:1)
两者都是赋值运算符,赋值运算符从右到左进行求值。因此(假设n!= 0)组合赋值与此相同:
y[i] /= ((double)n);
x[i] = y[i];
当然,第一个陈述也可以写成:
y[i] = y[i] / ((double)n);
答案 2 :(得分:1)
以下2个符号:=
和/=
是赋值运算符。它们用于将右侧的变量设置为右侧的值或变量。 =
运算符很简单;它对左边的值没有操作。所以,如果我们有一个如下声明:
int x = 5;
此处的等式赋值运算符只是将x设置为5.
您感到困惑的代码行中的第二个运算符是复合赋值运算符组的一部分。该运算符执行2个操作:首先获取存储在运算符左侧变量中的值,将其除以运算符右侧的值,然后将其再次存储在运算符左侧的变量中。因此,如果我们采用这段简单的代码:
int y = 25;
y /= 5;
这段代码声明了一个int类型的变量,初始化为25.第二行将y
的值除以5,ad将变量y更新为数学运算的结果值。
现在,我们不限于将固定值,变量或函数的返回值作为赋值运算符右侧的语句。我们可以很好地评估一个表达式(就像我们做y[i] /= ((double)/n)
一样),然后将y[i]
的更新值赋给x[i]
。编译器只是先评估右边的表达式,然后继续将其分配给左手变量。
现在,通过这个解释,我们可以很容易地总结这一行:
x[i] = y[i]/=((double)n);
编译器将y[i]
的值除以值n,将其转换为double(此处不需要y
本身的类型为double),将新值赋给y[i]
,然后为x[i]
分配y[i]
的更新值。