为什么在同一行上有 2 个函数调用时跳过函数调用

Why does the function call get skipped when there are 2 function calls on the same line?

本文关键字:函数调用 一行 为什么      更新时间:2023-10-16

我很困惑为什么这条线:

cout << "Your average in this course is " << average() << " and your letter grade is " << convert_to_letterGrade() << "n";

不起作用,而以下工作(一个 cout 分为 2 个):

cout << "Your average in this course is " << average();
cout << << " and your letter grade is " << convert_to_letterGrade() << "n";

此代码位于 void 函数中,该函数是类 Grades 的公共成员。 average()计算结果并将其存储在私有成员变量 averageScore 中,并返回 averageScoreconvert_to_letterGrade() 根据 averageScore 的值返回一个char值,如果平均分数不合理,则返回错误消息,并且这两个函数都是类的私有成员。

在第一种情况下,我首先收到来自convert_to_letterGrade()的错误消息,然后是cout语句应该打印的内容。cout语句打印了正确的averageScore值,但是当我进入convert_to_letterGrade()时,该函数仍在使用垃圾值进行averageScore,而第二个工作正常,convert_to_letterGrade()也使用正确的averageScore值。

这是为什么呢?

您应该知道,表达式中的函数可以按任何顺序调用。

我假设您对convert_to_letterGrade的实现取决于首先调用 average(),这在您的第一个语句中无法保证。

编写一个只有在之前调用过另一个函数时才给出正确结果的函数是一种危险的做法。如果我只想将成绩打印为信件会怎样?我必须记得先打电话给平均()吗?这是一种可怕的做法。或者,如果您想先打印字母分数,然后打印平均值怎么办?

convert_to_letterGrade() 根据 averageScore 的值返回一个字符值,如果平均分数不合理,则返回错误消息

根据您对行为的描述,这实际上不是真的。

如果分数合理,则当前函数返回char值,如果不合理,则直接向cout打印错误消息。

修复它就像按照您所说的操作一样简单,将错误字符串设置为返回值,以便调用方控制何时打印它。

除此之外,您还存在convert_to_letterGrade()依赖其他函数设置的变量的问题。 正如 gnasher729 在他的回答中提到的那样,除非您在两者之间放置一个序列点,否则无法保证average()convert_to_letterGrade()之前被调用。