我一直盯着这个约一个小时,老实说我不知道我错过了什么。
#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.我不知道这些数字来自哪里。
答案 0 :(得分:5)
请记住,<<
是函数调用的合成糖,这些函数的评估顺序不一定按照您认为的顺序。事实上,C ++实际上并没有指定顺序。因此,您的第二个cout
的最后部分将打印出feet
和inches
的起始值。
在第二个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 << x
是operator<<(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