C ++通过引用传递不改变参数

时间:2018-03-05 08:32:46

标签: c++

我一直盯着这个约一个小时,老实说我不知道​​我错过了什么。

#include <iostream>

using namespace std;

void callChain();

double chain(int, int &, int &);

int main()
{
    callChain();
}

void callChain() {
    int totalInches = 53;
    int feet;
    int inches;

    cout << "\nTesting chain for 53 inches: \nExpected result: 15.46 feet: 4 inches: 5" << endl;
    cout << "Actual result: " << chain(totalInches, feet, inches) << " feet: " << feet << " inches: " << inches << endl;
}

double chain(int totalInches, int &feet, int &inches) {
    feet = totalInches / 12;
    inches = totalInches % 12;

    return (feet) * 3.49 + (inches) * .30;
}

回归是正确的,所以很明显功能正常,但对于我的生活,我无法弄清楚为什么脚和英寸不会改变。一切都拼写正确,我有我的所有&符号,但由于某种原因,显示器显示英尺为8英寸为7.我不知道这些数字来自哪里。

3 个答案:

答案 0 :(得分:5)

请记住,<<是函数调用的合成糖,这些函数的评估顺序不一定按照您认为的顺序。事实上,C ++实际上并没有指定顺序。因此,您的第二个cout的最后部分将打印出feetinches的起始值。

在第二个chain(totalInches, feet, inches)之前的中间步骤中调用cout,甚至可能以这种方式(Acknowledge @DavidSchwartz):

cout << "Actual result: " << chain(totalInches, feet, inches);
cout << " feet: " << feet << " inches: " << inches << endl;

答案 1 :(得分:1)

根据ostream chaining, output order

,ISO C ++标准中未指定评估顺序

要确保在访问这些变量之前调用该函数,请将输出链分开:

cout << "Actual result: " << chain(totalInches, feet, inches);
cout << " feet: " << feet << " inches: " << inches << endl;

答案 2 :(得分:0)

为了更好地说明目前给出的答案(提供更多细节):

std::cout << xoperator<<(std::cout, x)的语法糖;当operator<<返回其第一个参数时,std::cout << x << y;得到:

operator<<(operator<<(std::cout, x), y);

显然,外部调用的第一个参数将在执行外部调用之前进行评估(例如执行的内部调用) - 这是任何保证已经结束的地方,i。即由于参数评估的顺序未指定,编译器很可能在调用内部运算符之前评估y - 包括对后者参数的评估!

operator<<(operator<<(std::cout, f(x)), x);

同样现在,这里唯一的保证是在调用内部运算符之前调用f(x)并在外部运算符之前调用内部运算符;仍然,原始的x可以在最初评估......

显然,你的编译器开始评估从最后到第一个的参数,很可能是由于正在使用的调用约定(很可能是cdecl;在Windows上可能是stdcall)...

接受的答案的变化引入了函数调用之间的序列点(旧的,前C ++ 11写法),这确保了在调用下一个函数之前完成前一个调用的所有效果,即。即(使用新的C ++ 11措辞):

operator<<(std::cout, f(x)); // is sequenced  b e f o r e  next line
operator<<(std::cout, x);    // is sequenced  a f t e r  previous line