在c中传递char作为参数

时间:2012-09-10 22:03:54

标签: c function char argument-passing

我只是想学习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的总和。但是,当我尝试将一个字符作为参数传递给函数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一起工作时这不起作用。我已经在google上搜索了很多,但问题通常只包括将一组字符作为参数传递,而不是char。

或者我这样做错了吗?

4 个答案:

答案 0 :(得分:3)

calculate()函数放在main()函数上方。编译器在调用它之前需要知道该函数。

或者,您可以通过在main之前加上此行来向前声明main()以上:

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

它还有助于打开编译器中的警告。使用GCC,您可以使用-Wall

答案 1 :(得分:2)

由于编译器在调用它之前没有看到 {/ 1}}的定义,它必须创建一个隐式声明,并希望声明是正确的。事实证明它不是。

要解决此问题,请将calculate()的定义移到调用它的calculate()之上,或者将main()的函数原型提供给声明什么在calculate()

之前,函数在调用之前看起来像
main()

另请注意,如果对变量使用标识符int calculate(int number1, int number2, char operator); 并使用C ++编译器编译代码,则会出现错误,因为operator是C ++关键字。< / p>

答案 2 :(得分: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 :(得分: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的价值,但您拥有的是一个良好的开端。)