我如何阅读这个小程序?

时间:2020-04-30 09:13:23

标签: c++

我一直在努力寻找增量运算符如何与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;
}

提前谢谢!

2 个答案:

答案 0 :(得分:4)

问题的症结在于代码的这一部分:

int fun1(int d) { }
int fun2(int &d) { }

第一个函数中的int dvalue semantics。这意味着传递给函数fun1的变量的值是复制的,并且仅在fun1内部知道。

int &d引用语义,这意味着传递给fun2的变量由d引用,因此,如果您修改dfun2内部,更改了传递给fun2的变量的实际值。

在您的情况下,这意味着a的值由fun1复制,而fun2更新b的值。因为dfun2中用作存储值的实际变量b的{​​{3}}。

此程序打印的8的值还有更多。 ++d是前递增运算符,d++是后递增运算符。含义:

  • 预递增:先递增d,然后使用新值d
  • 后递增:保留d的值并使用该值做某事,然后再递增d的值

结合这些因素(值/引用语义以及前后递增的行为),我们得出fun1fun2返回d的原始值,该值在返回原始值。因此return d++;等效于这段代码:

int returnvalue = d;
d = d + 1;
return returnvalue;

但是由于fun2在主变量中对变量d的引用是b,所以b中的值将增加1,因为d是后置的。在return d++中递增。

referenceISOcpp value and reference semantics.关于C ++中的指针和引用之间的区别。


如果您需要对这些术语及其含义进行更大的解释,那么此stackoverflow建议是不错的选择。我的选择是C ++创建者的C ++之旅。遍历您现在应该了解的有关C ++的一切,而且非常便宜。

答案 1 :(得分:0)

由于第一个答案还没有完全进入当前的示例中,因此我将对其进行详细说明,因为它首先是一个棘手的主题IMO。

int a = 1, b, c;

这将声明三个int变量:abc。它还使用值1初始化abc收到int的默认起始值​​,因此为0。

作为第一个答案,fun1(int d)将传递给它的变量的值复制到局部变量中,但不更改原始变量。不过,++dd++有什么问题?这与执行操作的顺序有关。 ++dd的值,将其增加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 = 1b = 4c = 3和1 + 4 + 3 = 8。

相关问题