编译原理形参
‘壹’ c函数形参如果没有名字,只有类型,在下面使用的时候,怎么使用
定义的时候确实可以不写形参名字。
你如果学了编译原理的话可以知道函数间是如何传参的(大多语言是通过栈),
c语言是第n个参数先压栈,再压第n-1个,。。。再压第一个。最后修改栈顶指针add esp,8。
当进入函数时都是
push ebp
mov ebp,esp
所以可以这么实现
//VS2010环境
void f(int,int)
{
int a,b;
__asm //这是嵌入汇编关键字,在VC6.0嵌入汇编好像是asm
{
mov eax,[ebp+8]
mov a,eax ;第一个参数
mov eax,[ebp+12]
mov b,eax ;第二个参数
}
printf("%d\t%d\n",a,b);
}
void main()
{
f(7,3);
}
‘贰’ 静态存储分配和动态存储分配之间有什么不同 编译原理
myisam_recover=64K#允许的GROUP_CONCAT()函数结果的最大长度transaction_isolation=REPEATABLE-READinnodb_file_per_table
‘叁’ 编译原理题目。。给100分
是VB啊 我好久没弄了,先学习下
‘肆’ 一些关于编译原理的题目(选择,判断)
2年前还会做,现在都忘了
‘伍’ 第32题 为啥D是对的 不是说形参数组除一维长度以外 其他维度长度需要相等吗
可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:
void Func(int array[3][10]);
void Func(int array[][10]);
二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:
void Func(int array[][]);
因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多 少列,不能只指定一维而不指定第二维,下面写法是错误的:
void Func(int array[3][]);实参数组维数可以大于形参数组,例如实参数组定义为:
void Func(int array[3][10]);
而形参数组定义为:
int array[5][10];
这时形参数组只取实参数组的一部分,其余部分不起作用。
[原文结束]
大家可以看到,将二维数组当作参数的时候,必须指明所有维数大小或者省略第一维的,但是不能省略第二维或者更高维的大小,这是由编译器原理限制的。大家在学编译原理这么课程的时候知道编译器是这样处理数组的:
‘陆’ C语言串赋值操作,形参有些不懂,int strassign(Str &str,char *ch)目的是将常量字符串赋给str
在int strassign(Str &str,char *ch)中,str是引用传递,ch是以'\0'结束的字符串,无论ch是字符数组,还是字面常量,都会将形参的首地址作为指针传递给被调函数,在所给实例中,形参是字面常量,编译器会在“栈”中分配空间用以存放字面常量,这与在主调函数中用字符数组或指针调用完全一样。
‘柒’ 有关c程序 的问题。函数作为形参的问题
#include <stdio.h>
int main()
{
int fac(int n);
int sum(int m,int n);
int n,a;
scanf("%d",&n);
printf("%d!=%d\n",n,fac(n));
a=fac(n);
printf("%d\n",sum(a,n));
return 0;
}
int fac(int n)
{
int f;
if (n==0||n==1)
f=1;
else if (n<0)
printf("data error");
else
f=n*fac(n-1);
return(f);
}
int sum(int m,int n)
{
int i,f=0;
for(i=1;i<=n;i++)
f=f+fac(i);
return(f);
}
我帮你改了下,能用了.
int sum(int fac(int n),int n)
这里定义形参时出错了。形参是一个变量,代表着被调用时分配的内存单元的名字,不能用 fac(int n)。
函数被调用时,是实参传递给形参值,即就是把实参代表的内存单元的值赋值给了形参,在函数调用完时,再返还一个函数的值,这个值可以再赋值给被的变量或着直接用printf()函数输出这个值。
楼上的网址我也看了,不过还没学过那个用法。~-~
一会去试试。~-~
‘捌’ C#的可选参数,为什么一定要放在参数列表的最后
这涉及到编译原理了,一般地,函数的形参(如果有的话),函数的形参入栈是由左至右入栈,排第一的形参被第一个压入栈里,成为栈底元素,关键点就这里,因为形参的第一个参数必须是确定的,由此,编译器系统才可以对函数开辟一个保存形参的栈区,然后第一个之后的元素陆续入栈。如果是把可选的参数排在前面,由于它是不确定的,编译系统无法预知何时才会需要对函数开辟一个保存形参的栈区。所以,.NET的编译器规定必须把可选的形参统统放在最后。