編譯原理形參
『壹』 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的編譯器規定必須把可選的形參統統放在最後。