首先,看一道某年全国二级C语言考试的选择题。
问以下代码输出结果
代码语言:javascript复制int func(int a,int b)
{ int c;
c=a b;
return c; }
main()
{ int x=6,r;
r=func(x,x =2);
printf("%dn",r); }
选项大概是 12、14、16、 有误无法运行。
选 14的人占多数,还有不少认为有误无法运行的。
首先,这段代码是可以执行的。
这道题谈不上难,但不知道的就会错。
这道题答案是16。
对于函数的参数,在计算的时候是按照从右往左的顺序进行的。
对于函数func,先求右边x =2参数,返回x=8,然后计算结果。也就是传递给形参的两个值都是8,返回值为16。
下面我们写程序验证下,并结合自增自减运算升级下难度。
思考下面程序执行结果:
代码语言:javascript复制#include<stdio.h>
void fun(int m,int n)
{
printf("%d %dn",m,n);
}
int main()
{
int a=100;
fun(a,a =2);
printf("%d,%d,%dn", a,a--, a);
printf("%dn",a);
return 0;
}
根据上面讲到的内容,你要想到的是printf也是函数,参数计算也要按照从左往右。但这时候涉及到 ,多数同学就又会弄不清了。我们看下执行结果,帮助大家理解。
首先,第一行验证了传递给形参的值都是a加2之后值102.
第二行,按照从右往左,第一个是先让a的值 1,输出103。第二个还是a 103。但下一步是先让a的值-1,再计算左边的参数,还是别的呢?
根据运行结果,我们知道是先计算左边参数,a的值 1输出104,然后用完了以后a的值-1。
最后一行输出103也验证了是最后执行a的值-1。