2013-12-20 41 views
-7

這裏的整個源:靜態短基準國債收益率遞歸函數的錯誤

#include <iostream> 
void recursion(static short &di); 
using namespace std; 

int main() 
{ 
    short pi = 1; 
    for(pi; pi > 0; pi++) 
    { 
     cout << "Hi, pi!" << "\n"; 
     recursion(pi); 
    } 
} 
void recursion(static short &di) 
{ 
    di++; 
    if(di < 20) 
    { 
     return; 
    } 
    else 
    { 
     cout << di << "\n";  
    } 
} 

出於某種原因,它工作正常時,16位容器也不是一成不變的,但我希望它是靜態的,它會產生以下錯誤:

main.cpp:2:29: error: storage class specifiers invalid in parameter declarations void recursion(static short di); ^ main.cpp:2:29: error: storage class specified for parameter 'di' main.cpp:14:29: error: storage class specifiers invalid in parameter declarations void recursion(static short di) ^ main.cpp:14:29: error: storage class specified for parameter 'di'

+4

我絕對感到困惑,你想到了一個靜態的參數會做 –

+0

閱讀和思考 - 該錯誤信息是非常微不足道的! –

回答

8

您無法爲函數參數指定存儲持續時間static

您仍然可以將對static varibale的引用傳遞給函數,並且該引用仍將引用static變量。

例如:

int main() 
{ 
    static short pi = 1; 
// ^^^^^^ 
    for(pi; pi > 0; pi++) 
    { 
    cout << "Hi, pi!" << "\n"; 
    recursion(pi); 
    } 
// ... 
} 

void recursion(short &di) 
{ 
// ... 
} 

但在你的情況做一個pi似乎static相當無意義。


您可能不會完全理解存儲時間意味着什麼,所以我冒昧解釋。

通常你聲明變量,而不static限定符是這樣的:

void foo() 
{ 
    int myValue = 42; 
} 

甲varibale聲明如下具有自動存儲持續時間;意思是當它「超出範圍」時,該對象被銷燬。如果你打電話給foo() 100倍:

int main() 
{ 
    for (int i = 0; i < 100; ++i) 
    foo(); 
} 

...然後myValue將被重新初始化100倍。通常這正是你想要的。

有時你想要一個變量超出它聲明的範圍。要做到這一點,你給它靜態存儲時間,使用static關鍵字:

void foo() 
{ 
    static int myValue = 42; 
} 

變量聲明這種方式將被準確地初始化一次,這是第一次使用前,將繼續即使住它超出了範圍。它會保留它的價值,直到它被重新分配,直到程序結束。


您的代碼:

int main() 
{ 
    short pi = 1; 
    for(pi; pi > 0; pi++) 
    { 
     cout << "Hi, pi!" << "\n"; 
     recursion(pi); 
    } 
} 

建立pi變量,然後調用recursion多次。這裏pi確實不是需要靜態存儲持續時間,因爲在呼叫recursion的循環中它永遠不會超出範圍。你所要做的就是將pi的引用傳遞給recursion,它將按照你的意圖行事。

0

錯誤信息非常明確;你不能有正式參數的static限定符;需要聲明

void recursion(short &di); 

後來定義

void recursion(short &di) { 
    di++; 
    if(di < 20) 
     return; 
    else 
     cout << di << "\n";  
    }