问题描述
- 以下程序运行后的打印结果是______(需要写上分析思路)
-
#include
int sum(int a, int b)
{
return a + b;
}int two(int n)
{
return n * 2;
}void test(int n)
{
printf("%dn", two(n));
}int main()
{
test( sum(10, 11) );
return 0;
}
解决方案
sum(10, 11) 得到21
test输出 two(21),21 x2=42
所以输出42
以上结果经上机验证
http://codepad.org/y0Ig8vjW
解决方案二:
运行主函数main(),主函数执行test(),test调用two函数,sum(10,11)返回int型参数给two(21),two(21)结果为42,
解决方案三:
sum函数传入10和11返回21,然后sum函数的返回值21作为形参传入test函数,test调用two函数将形参乘以2并且返回得到42,最终输出42
解决方案四:
首先看main方法
(1)执行test方法,传的值是sum(10,11);
(2)计算出sum(10,11),调用sum方法------------a=10,b=11,return 10+11=21
(3)调用test方法-----------------n=21,则打印two(21);
(4)调用two方法-----------------n=21,return n*2=21*2=42;
(5)所以执行的结果是 42。
解决方案五:
首先看main方法
(1)执行test方法,传的值是sum(10,11);
(2)计算出sum(10,11),调用sum方法------------a=10,b=11,return 10+11=21
(3)调用test方法-----------------n=21,则打印two(21);
(4)调用two方法-----------------n=21,return n*2=21*2=42;
(5)所以执行的结果是 42。
解决方案六:
看程序员文件,要找到程序入口main(),函数从main()函数入口,顺序执行。
test( sum(10, 11) );//调用了两个函数,test()和sum()函数。
这里需要知道函数的一般原型:
(.....)name(....);
name:是指函数名
第一个括号,以一个括号为边界,里面填写的是函数的返回值(如果把函数看成一个变换机,或者黑盒子,那么返回值可以对一个变换机运行完输出的数据),比如说这里的main()函数返回值通过return返回0,sum函数返回a+b。
第二个括号,以一个括号为边界,里面填写的是函数的输入参量,(如果把函数看成一个变换机,或者黑盒子,那么函数参数可以对一个变换机的输入,或者变换机要处理的数据),比如test函数参数int类型的a参数。
这样理解test( sum(10, 11) )就很容易了,test()函数要处理的数据,是sum()函数的输出,也就是sum()要处理的数据是整型10,11,返回a+b即10+11=21,返回21.
21作为test()输入,test()函数又库函数printf()打印函数,往终端上打印数据,而printf()的输入,或者说要打印的数据,来自two( ) 函数处理输入数据21后的结果n * 2=21*2=42,所以printf()往终端打印42.
好像很麻烦,很绕,但找到函数入口,或者说起始点,然后顺序理清函数的逐级调用关系,一切就明朗、简单了~
可以理解为:数据流(原始数据)通过一个一个的黑盒子(变换机)最终得到你想要的结果~