C语言中,可以保证:
1. 所有函数都使用值传递:其实即使是指针,也是值传递。C++中引用传递归结到最后仍然是值传递
2. 实参到形参的参数传递过程其实是形参的初始化(!=赋值)过程。传递参数时做一些运算表达式,直接按赋值初始化理解
3. 形参的作用域是函数域,它和函数内定义的其他自动变量一样,并没有任何特殊性。
4. 函数形式参数带const限定符时,实参是可以成功传递的,这次传递相当于初始化。一旦初始化后,即不允许改变
5. 参数传递的顺序是从右到左。
例子一:(规则2)
#include <stdio.h>
void func(int ii)
{
printf("In func():%d\n", ii);
}
int main()
{
int i=0;
func(i++);
printf("Out func():%d\n", i);
return 0;
}
结果:
In func():0
Out func():1
可见将实参i传入到函数形参时,即是赋值的过程。
ii = i++;
例子二:三段小程序(规则4)
#include <stdio.h>
int main()
{
int i=0;
const int j=i;
return 0;
}
此程序不会有任何问题。
#include <stdio.h>
int main()
{
int i=0;
const int j;
j=i;
return 0;
}
这段程序会有编译错误!所以你必须分清初始化和赋值的关系
#include <stdio.h>
void func(const int ii)
{
printf("In func(): %d\n", ii);
}
int main()
{
int i=0;
func(i);
return 0;
}
这个程序却无任何错误。
例子三:(规则5)
#include <stdio.h>
void func(int i, int j)
{
printf("In func(): i=%d\n", i);
printf("In func(): j=%d\n", j);
}
int main()
{
int i=0;
func(i, i++);
return 0;
}
结果:
In func(): i=1
In func(): j=0
#include <stdio.h>
void func(int i, int j)
{
printf("In func(): i=%d\n", i);
printf("In func(): j=%d\n", j);
}
int main()
{
int i=0;
func(i, ++i);
return 0;
}
结果:
In func(): i=1
In func(): j=1