4

我只是想学习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;
}

这在怀疑时有效,它会写出 number1 和 number2 的总和。但是,当我尝试将字符作为参数传递给函数计算时,就像这样

#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(),它必须创建它的隐式声明并希望声明是正确的。事实证明不是。

要解决这个问题,要么将定义calculate()向上移动到main()调用它的位置,要么提供一个函数原型calculate()声明函数在调用之前的样子, before main()

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

另请注意,如果您operator为变量使用标识符并使​​用 C++ 编译器编译您的代码,您将收到错误,因为operator它是 C++ 关键字。

于 2012-09-10T22:08:56.157 回答
2

您必须告诉编译器有关函数计算的原型

#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 回答
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 回答