为何调用C语言函数时输出顺序与预期不符?
实际输出与预期不符的原因:C语言函数参数的求值顺序
你的问题核心在于对C语言中函数参数求值时机的误解:
当调用一个函数(比如printf)时,C标准明确要求:所有传入的实参必须在函数本身开始执行前完成求值。也就是说,printf要输出的内容里用到的三个参数4、10、apple(10, 4),必须先全部计算出来,才能让printf开始处理格式化输出。
其中apple(10, 4)是一个函数调用,所以它的执行优先级高于printf的执行:
- 先调用
apple(10,4),执行函数内部的printf,输出This is a function with a passing value. apple函数返回10-4=6,作为第三个实参的值- 此时三个实参都准备完毕,才会执行
main里的printf,输出If you eat 4 out of 10 apples, there will be 6 left.
这就是为什么实际输出顺序和你预期的相反。
另外补充:C标准并没有规定多个实参之间的求值顺序(比如先算第一个参数还是第三个),但对于作为实参的函数调用,它必然会在主函数(这里是printf)执行前完成,这是确定的。
如何实现你预期的输出顺序
如果想要先输出main里的内容,再输出apple函数内的信息,你需要调整代码逻辑,把apple函数的调用和printf的执行分开——示例代码如下:
#include <stdio.h> int apple(int total, int ate); int main(void) { // 先输出固定部分内容 printf("If you eat 4 out of 10 apples, there will be "); // 调用函数并获取返回值 int remaining = apple(10, 4); // 输出剩余部分 printf("%d left.\n", remaining); return 0; } int apple(int total, int ate) { printf("This is a function with a passing value.\n"); return total - ate; }
内容的提问来源于stack exchange,提问作者Bunzz
相关产品推荐
相关产品推荐

