①错误表达---形参可以是常量,变量或表达式。
关于形参
-
形参只能是变量,在被定义的函数中,必须指定形参的类型。
-
没有确定的值
-
形参变量在未出现函数调用时,并不占用内存,只在调用时才占用。调用结束后,将释放内存。
关于实参
-
实参可以是常量、变量、表达式、函数等
-
无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
-
开辟内存存储数据。
②错误表达---函数调用可以作为一个函数的形参
返回值存在寄存器中, 没有地址, 不能作为形参,但可以作为实参。
③函数之间的数据传递方式
函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
④C语言头文件<>和""的区别
1.头文件#include <> :表示引用标准库头文件,编译器会从系统配置的库环境中去寻找
2.头文件#include " ":一般表示用户自己定义使用的头文件,编译器默认会从当前文件夹中寻找,如果找不到,则到系统默认库环境中去寻找。
⑤关于宏定义
一般来说,宏定义(# define)是相当于字符替换,在代码预编译时就进行替换,编译时候所有宏定义的代码改变为被替换的代码,不限制任何代码,任何字符都可以进行宏定义,宏定义可以写在程序中的任何位置,它的作用范围从定义触到文件尾,在这些范围内都可以用宏名进行替换,宏是针对预处理器的任务;
宏名一般用大写字母表示,以示与变量区别。但这并非规定;宏定义不是C语句,所以不能在行尾加分号,否则,宏展开时,会将分号作为字符串的一个字符,用于替换宏名。
宏定义不占用运行时间,只占用编译时间。
代码错误问题
①若有宏定义#define MOD(x,y) x%y ,下面程序段的结果是()。 int z,a=15; float b=100; z=MOD(b,a); printf("%d",z++);
A.11
B.10
C.6
D.语法错误
选D,语法错误,z=b%a,C语言中运算符%要求两端的运算对象的数据类型必须为整数,由于B是浮点数,因此表达式是不合法的
②以下程序的运行结果是( )
#include <stdio.h>
#define MIN(x,y) (x)>(y) ? (x) : (y)
int main()
{
int i=10,j=15,k;
k=10*MIN(i,j);
printf("%d\n",k);
return 0;
}
A. 10 B. 15 C. 100 D. 150
选A,将k=10*MIN(i,j)展开得k=10*(i)>(j),根据运算符优先级,先计算10*(i),将变量值带入上式后变为k=100>(15)?(10):(15),则k=10 。
③在任何情况下计算平方数都不会引起二义性的宏定义是( )
A. define POWER(x) x*x
B. define POWER(x) (x)*(x)
C. define POWER(x) (x*x)
D. define POWER(x) ((x)*(x))
选D,在进行带参数的宏定义时,要确保运算过程没有二义性,应对被替换字符串中的每个形参都加上括号,因此应选D
④以下程序的运行结果是
#define ADD(x) x+x
main( )
{ int m=1,n=2,k=3;
int sum=ADD(m+n)*k;
printf(“sum=%d”,sum); }
A) sum=9 B) sum=10 C) sum=12 D) sum=18
选c,展开后为 sum = m+n + m+n *k,1+2+1+2*3=10
⑤若有宏定义如下:
#include <stdio.h>
#define X 5
#define Y X+1
#define Z Y*X/2
int main()
{
int a=Y;
printf("%d ",Z);
printf("%d\n",--a);
return 0;
}
A.7 6
B.12 6
C.12 5
D.7 5
选D,X+1*X/2 = 5+1*5/2 =5+2.5 转换为整型为7,a--为5;
⑥
fun(int a,int b,int c)
{c=a*b;}
int main(void)
{int c;
fun(2,3,c);
printf("%d\n",c);
return 0;
}
输出结果为:A.0 B.1 C.6 D.无法确定
选D, 因为fun中的c不是main中的c, 当fun函数return后,fun中的c生命就结束了,而main中的c依然还是一个没有初始化的变量,所以是一个不确定的值
⑦分析以下程序的运行结果( )
把x和y传给函数func。所以实参是x和y,形参是a和b。虽然在fun函数中进行了a,b值的交换,
但是a,b仅仅是fun函数的内部变量,他们的值的变化不影响main函数中的x,y的值,所以x,y还是10,20。
#include<stdio.h>
func(int a ,int b)
{
int temp=a;
a=b;b=temp;
}
main()
{
int x,y;
x=10;y=20;
func(x,y);
printf("%d,%d\n",x,y);
}