写一个函数,每调用一次这个函数,就会将num的值加1
虽然这个题目很简单,但是有一些细节的地方,对于初学者来说容易忽略。导致结果不正确。
调用函数是传址还是传值
运算符的优先级
首先我们直接展示代码:
#include <stdio.h>
void Add(int *x)
{
(*x)++;
}
int main ()
{
int num = 0;
Add(&num);
printf("num = %d\n",num);
Add(&num);
printf("num = %d\n",num);
Add(&num);
printf("num = %d\n",num);
Add(&num);
printf("num = %d\n",num);
return 0;
}
运行结果为:
![](https://img-blog.csdnimg.cn/img_convert/e0dc21b5366d5f9cdfde88952cb27048.png)
需要注意的是:
这个函数需要通过传址的方式进行函数调用
如果这样书写:
使用普通变量调用,也就是值调用
#include <stdio.h>
void Add(int x)
{
x++;
}
int main ()
{
int num = 0;
Add(num);
printf("num = %d\n",num);
Add(num);
printf("num = %d\n",num);
Add(num);
printf("num = %d\n",num);
Add(num);
printf("num = %d\n",num);
return 0;
}
运行结果为:
![](https://img-blog.csdnimg.cn/img_convert/be35f72bbf2586b63aea0c0bd969a31d.png)
我们发现结果不正确,因为在值调用的过程中,参数的传递是从实参变量到形参变量的单方向传递,在函数Add内实现了x的自增,但当Add函数执行完,Add中定义的变量被销毁,回到主函数后,num没有受到任何影响。
搞清运算符的优先级
接下来我们使用址调用的方式
#include <stdio.h>
void Add(int *x)
{
*x++;
}
int main ()
{
int num = 0;
Add(&num);
printf("num = %d\n",num);
Add(&num);
printf("num = %d\n",num);
Add(&num);
printf("num = %d\n",num);
Add(&num);
printf("num = %d\n",num);
return 0;
}
运行结果为:
![](https://img-blog.csdnimg.cn/img_convert/eff054476812a8d0d35dcd4555fcafc1.png)
我们发现,运行结果依然不正确。
那是因为我们忽略了运算符的优先级,自增运算符是高于是高于取值运算符的,也就是++高于*,
所以我们需要加一对括号: (*x)++;
最后运行就可以发现结果正确啦~
![](https://img-blog.csdnimg.cn/img_convert/eedc49e1161511b2190ac00beed61341.png)