我只是想学习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。
或者我这样做错了吗?
答案 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
的价值,但您拥有的是一个良好的开端。)