我一直在努力寻找增量运算符如何与b,c的值相关联,以及在写参考符号时更改其值的方式。该程序将输出8,但是我不确定在这种特定情况下引用实际上是做什么的。这是代码:
int fun1(int d) {
++d;
return d++;
}
int fun2(int &d) {
++d;
return d++;
}
int main(void) {
int a = 1, b, c;
b = fun1(a);
c = fun2(b);
cout << a + b + c << endl;
return 0;
}
提前谢谢!
答案 0 :(得分:4)
问题的症结在于代码的这一部分:
int fun1(int d) { }
int fun2(int &d) { }
第一个函数中的int d
是value semantics。这意味着传递给函数fun1
的变量的值是复制的,并且仅在fun1
内部知道。
int &d
是引用语义,这意味着传递给fun2
的变量由d
引用,因此,如果您修改d
在fun2
内部,更改了传递给fun2
的变量的实际值。
在您的情况下,这意味着a
的值由fun1
复制,而fun2
更新b
的值。因为d
在fun2
中用作存储值的实际变量b
的{{3}}。
此程序打印的8
的值还有更多。 ++d
是前递增运算符,d++
是后递增运算符。含义:
d
,然后使用新值d
d
的值并使用该值做某事,然后再递增d
的值结合这些因素(值/引用语义以及前后递增的行为),我们得出fun1
和fun2
返回d
的原始值,该值在返回原始值。因此return d++;
等效于这段代码:
int returnvalue = d;
d = d + 1;
return returnvalue;
但是由于fun2
在主变量中对变量d
的引用是b
,所以b
中的值将增加1,因为d
是后置的。在return d++
中递增。
reference和ISOcpp value and reference semantics.关于C ++中的指针和引用之间的区别。
如果您需要对这些术语及其含义进行更大的解释,那么此stackoverflow建议是不错的选择。我的选择是C ++创建者的C ++之旅。遍历您现在应该了解的有关C ++的一切,而且非常便宜。
答案 1 :(得分:0)
由于第一个答案还没有完全进入当前的示例中,因此我将对其进行详细说明,因为它首先是一个棘手的主题IMO。
int a = 1, b, c;
这将声明三个int变量:a
,b
和c
。它还使用值1初始化a
。b
和c
收到int的默认起始值,因此为0。
作为第一个答案,fun1(int d)
将传递给它的变量的值复制到局部变量中,但不更改原始变量。不过,++d
和d++
有什么问题?这与执行操作的顺序有关。 ++d
取d
的值,将其增加1,然后将其分配回d
。另一方面,d++
首先将d
的值分配回d
(如果在return语句中使用,则从函数返回它),然后再将其递增1。为什么如此相关?
请记住,fun1(a)
与局部变量一起使用,因此实际上不会更改变量a
。 ++d
将局部变量增加1,所以现在是2。然后d++
返回d
(2)的当前值,然后再次将局部变量增加1-但是不会存储在函数fun1()
之外的任何地方。因此,变量b
现在的值为2。
c = fun2(b);
但是,是另一种情况。在这里,我们将对变量b的引用传递给函数。因此,++d
不仅增加了局部变量的值,而且还增加了b
的值,现在是3。d++
将此值返回给c(因此它被赋值为3) ,但还要将b
再增加1到4。为什么?因为d
是对b
的引用。
因此,我们的最终值是:a = 1
,b = 4
,c = 3
和1 + 4 + 3 = 8。