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

rui*_*sen -2 c++

我很困惑为什么这条线:

cout << "Your average in this course is " << average() << " and your letter grade is " << convert_to_letterGrade() << "\n";
Run Code Online (Sandbox Code Playgroud)

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

cout << "Your average in this course is " << average();
cout << << " and your letter grade is " << convert_to_letterGrade() << "\n";
Run Code Online (Sandbox Code Playgroud)

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

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

为什么是这样?

Ben*_*igt 5

convert_to_letterGrade() 如果平均分数不合理,则返回基于averageScore值的char值和错误消息

根据您对行为的描述,这实际上并非如此.

char如果分数合理,您的当前函数将返回一个值,或者cout如果不合理则直接输出错误消息.

修复它就像执行你所说的那样简单,使错误字符串成为一个返回值,以便调用者控制它何时被打印.

除此之外,您还有convert_to_letterGrade()依赖于其他函数设置的变量的问题.正如gnasher729在他的回答中提到的那样,除非你在它们之间放置一个序列点,否则不能保证average()之前会被调用convert_to_letterGrade().


gna*_*729 5

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

我假设你的convert_to_letterGrade的实现依赖于first()被首先调用,并且在你的第一个语句中不能保证.

如果之前调用了另一个函数,那么编写一个只能给出正确结果的函数是一种危险的做法.如果我只想将成绩打印成字母会怎么样?我是否必须记得首先调用average()?这是一个糟糕的做法.或者如果你想首先打印字母得分,然后是平均值?