4

私はcを学ぼうとしているだけで、行き詰まっています。演算子と一緒に 2 つの数字を入力して、答えを出力できるプログラムを作成しようとしています。

表記は逆ポーランド記法です。つまり、入力 2 1 + は出力 3 を提供し、入力 2 1 * は出力 2 を提供する必要があります。

後で、いくつかのスタック ベースのものを使用して rpn に長い式を入力できるように拡張しますが、ここではオペランドが 2 つだけの場合に焦点を当てます。

これは私がやったことです:

#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;
}

これは疑わしい場合に機能し、number1 と number2 の合計を書き出します。しかし、関数 calculate に引数として文字を渡そうとすると、このように

#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

cでcharを引数として渡すことはできませんか? int で動作するときにこれが動作しない理由がわかりません。私はこれについて何度もグーグルで検索しましたが、質問は通常、文字ではなく文字の配列を引数として渡すことのみをカバーしています。

それとも、私はこれをすべて間違っていますか?

4

4 に答える 4

3

calculate()関数の上に関数を置きmain()ます。コンパイラは、関数を呼び出す前に関数について知る必要があります。

または、次の行を前に含めることで、上記を前方宣言することもできます。mainmain()

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

コンパイラで警告をオンにすることも役立ちます。GCC では、 を使用できます-Wall

于 2012-09-10T22:07:16.177 に答える
2

関数calculateのプロトタイプについてコンパイラーに通知する必要があります。

#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;
}
于 2012-09-10T22:16:06.447 に答える
2

コンパイラは呼び出される前に の定義を認識しないcalculate()ため、暗黙の宣言を作成し、宣言が正しいことを期待する必要があります。そうではないことがわかりました。

これを修正するには、calculate()upの定義をmain()それが呼び出された場所の上に移動するか、代わりに の関数プロトタイプを提供して、呼び出される前に関数がどのように見えるかcalculate()宣言main()します:

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

また、変数に識別子operatorを使用し、C++ コンパイラを使用してコードをコンパイルするoperatorと、C++ キーワードであるため、エラーが発生することに注意してください。

于 2012-09-10T22:08:56.157 に答える
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が、あなたが持っているものは良い出発点です。)

于 2012-09-10T22:09:21.610 に答える