请考虑以下事项:
int a[2];
cin >> a[0] >> a[1];
const int D = a[1] - a[0];
cout << D << "\n";
a[1] = 5; a[0] = 2;
cout << D << "\n";
我现在有点困惑。为什么它为D打印相同的值?为什么不更改数组值会改变D的值?在什么时间点确定并存储了D的值?
谢谢!
答案 0 :(得分:2)
D
的值在您指定的行中确定。它不能仅因为用于计算它的表达式中的值发生更改而更改,即使它未声明const
。 (很少有编程语言的变量像Excel电子表格单元一样工作:重新计算所有内容的成本是不可预测的,但是很重要。)
如果您想要更改D
的值,则必须显式指定一个新值,除非您删除const
,否则编译器不会允许您执行此操作。
答案 1 :(得分:1)
您可以为D创建一个特殊类,当它引用的值发生变化时会重新评估。
class Diff
{
int & first;
int & second;
public:
Diff( int & a, int & b ) :
first( a ), second( b )
{
}
int get() const
{
return first - second;
}
};
std::ostream & operator<<(std::ostream & os, const Diff & diff )
{
return os << diff.get();
};
你的班级在这里依赖于它必须保持活动的两个值,即如果其中一个超出范围,你的班级就会有错误的引用。你可以重载operator int()来代替get(),虽然隐式转换重载通常被认为是不好的做法。
答案 2 :(得分:0)
计算D的值并将其存储在以下行中:
const int D = a[1] - a[0];
D现在是一个变量,它有自己的值。 D是const,它的值永远不会改变(没有黑客攻击)。
未定义C ++变量(以及任何编程语言变量) 与其他变量的关系。它们被定义为可变(或不可)的值。
答案 3 :(得分:0)
const int D = a[1] - a[0];
就在那里。此时,D
的值由a[1]
和a[0]
的当前值确定并存储。然后,它会完全与a[1]
和a[0]
断开连接。对这两者的更改将不再对D
产生影响。
在绝大多数编程语言中,这正是它的工作原理。 =
运算符称为赋值运算符。它在右侧获取表达式的结果,并将其分配给左侧的变量。它按价值运作,而不是通过参考。因此它只会将执行时的值赋给变量。该变量不会随着第二次分配而改变。
在C ++和其他一些语言中,有些情况并非如此,它们处理的是指针。并且看起来像这样:
int b = 5;
int *d = &b;
右侧的表达式是分配给指针的(单个)变量的地址(&
运算符是地址运算符,声明上的*
运算符声明{{ 1}}是一个指针)。然后指针包含该变量的地址。取消引用时它给出的值是变量的值。但是,指针只保存单个变量的值。它们不能是表达式的别名。但是在你进一步深入研究指针之前,你应该让自己更好地掌握语言。指针是相当复杂和高级的主题。
答案 4 :(得分:0)
这是一个反问题,可以帮助您思考这是如何工作的:
int a[2];
cin >> a[0] >> a[1];
int D = a[1] - a[0];
D = 6;
现在,在改变D之后,[0]和[1]应该分别为1和5,2和4,还是3和3?
如果这没有意义,那为什么它应该反过来呢?