2012-09-10 42 views
2

我只是想學習c而我被卡住了。我正在嘗試創建一個可以輸入兩個數字的程序,並與操作員一起打印出答案。在c中傳遞一個字符作爲參數

符號是顛倒的波蘭符號。也就是說,輸入2 1 +應該給出輸出3,輸入2 1 *應該給出輸出2.

稍後,我將展開它,以便您可以在某些基於堆棧的情況下在rpn中輸入更長的表達式但我們現在只關注僅有兩個操作數的情況。

這是我做了什麼:

#include <stdio.h> 

main() 
{ 
    int number1; 
    int number2; 
    char operator; 
    scanf("%d %d %c", &number1, &number2, &operator); 
    printf("%d", calculate(number1, number2)); 
} 

int calculate(int number1, int number2) 
{ 
    return number1+number2; 
} 

這個工作在懷疑,並將其寫入了數字1和數字2的總和。然而,當我試圖傳遞一個字符作爲參數傳遞給函數計算,像這樣

#include <stdio.h> 

main() 
{ 
    int number1; 
    int number2; 
    char operator; 
    scanf("%d %d %c", &number1, &number2, &operator); 
    printf("%d", calculate(number1, number2, operator)); 
} 

int calculate(int number1, int number2, char operator) 
{ 
    return number1+number2; 
} 

我得到一個編譯錯誤

rpn.c:12:5: error: conflicting types for ‘calculate’ 
rpn.c:13:1: note: an argument type that has a default promotion can’t match an empty parameter name list declaration 
rpn.c:9:15: note: previous implicit declaration of ‘calculate’ was here 

是沒可能通過一個char在C參數?我不明白爲什麼這不起作用時,它與int。我在這裏搜索了很多,但問題通常只包括傳遞一組字符作爲參數,而不是字符。

還是我這樣做全錯了?

回答

3

calculate()函數放在main()函數之上。編譯器在調用它之前需要知道該函數。

或者你可以前瞻性聲明上面main通過包括main()之前該行:

int calculate(int number1, int number2, char operator); 

這也將有助於打開你的編譯器警告。有了GCC,你可以使用-Wall

2

由於編譯器在調用之前沒有參見calculate()的定義,它必須創建它的隱式聲明並希望聲明是正確的。事實證明,事實並非如此。

爲了解決這個問題,無論是移動在那裏它被稱爲的calculate()了上述main()定義,或者提供的calculate()函數原型聲明什麼功能看起來像它的調用之前,main()前:

int calculate(int number1, int number2, char operator); 

另外請注意,如果你使用標識符operator作爲你的變量並且使用C++編譯器來編譯你的代碼,你將會得到一個錯誤,因爲operator是一個C++關鍵字。

+0

最後一個問題的解決方案很簡單:使用C編譯器編譯C代碼。 –

+0

@KeithThompson:好的,但我看到很多人用C++編譯器編譯它們的C代碼。 – AusCBloke

+0

我還是不明白。爲什麼它使用int作爲參數,但沒有兩個整數和char?如果是我還沒有申報,那麼在這種情況下是否也應該收到錯誤消息? – user1661303

1

當編譯器看到您致電calculate時,它尚未看到calculate的聲明。

對於初學者來說,你的main定義之前加入這一行:(注意)分號後)

int calculate(int number1, int number2, char operator); 

如果沒有預申報,調用calculate創建一個隱含的聲明在電話會議上;隱式聲明的工作方式不同(因爲與參數升級和舊式函數聲明有關的難以理解的歷史原因;不要擔心細節)。這是1990年版本的語言。從1999年ISO C標準開始,這種隱式函數聲明甚至不存在。考慮調用你的編譯器,使其符合C99標準(如果它支持的話,甚至是C11)。你似乎在使用gcc;如果是這樣,gcc -std=c99 -pedantic -Wall -Wextra通常會給你更徹底的診斷。

一些其他方面的改進:

main()應該int main(void)

格式字符串"%d"應該是"%d\n",因此它會打印一個完整的行。

(當然你要calculate注意的operator價值,但你有什麼是一個好的開始。)

+0

感謝大家的快速回復。我會試試看。我也懷疑這個void函數是int。不是c被設計成儘可能小和儘可能少的記憶足跡?那麼爲什麼要讓所有的無效函數返回一個int值呢?難道這使得功能使用更多的內存比它需要? 我使用gcc,它會嘗試編譯C++關鍵字還是我安全? – user1661303

+0

@ user1661303:不,「void」函數不是「int」。定義爲返回「void」的函數不返回結果。定義爲返回int的函數返回int結果。 *在1999年的標準*之前,一個沒有顯式類型的函數隱式地返回'int',所以'func();'和'int func();'是等價的聲明。 (在1989/1990標準之前,沒有'void'關鍵字。)1999年標準放棄了這個「隱式int」規則,所以省略類型不再合法。如果一個函數返回'int',你必須明確地說。這與內存佔用無關。 –

+0

所以,如果我正確地理解這一點,在1989年的標準之前,你不可能有一個沒有返回值的函數?這是否會使內存佔用更大,因爲即使函數本身不需要發送返回值,也必須返回一個int值? 對不起新問題。 – user1661303

2

你必須告訴有關prototype編譯器爲函數計算。

#include <stdio.h> 

int calculate(int,int, char); // This is your prototype. 
main() 
{ 
    int number1; 
    int number2; 
    char operator; 
    scanf("%d %d %c", &number1, &number2, &operator); 
    printf("%d", calculate(number1, number2, operator)); 
} 

int calculate(int number1, int number2, char operator) 
{ 
    return number1+number2; 
} 
+3

請注意,參數名稱是可選的在原型中(這不是定義的一部分)。換句話說,你*可以*寫'int calculate(int,int,char);',但是你也可以寫'int calculate(int number1,int number2,char operator);'。恕我直言,更明確的形式更好。 –

相關問題