在 c 中将 char 作为参数传递
Posted
技术标签:
【中文标题】在 c 中将 char 作为参数传递【英文标题】:Passing a char as an argument in c 【发布时间】:2012-09-03 19:35:18 【问题描述】:我只是想学习 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 一起使用时它不起作用。我对此进行了很多谷歌搜索,但问题通常只涉及将字符数组作为参数传递,而不是字符。
还是我做错了?
【问题讨论】:
【参考方案1】:将calculate()
函数放在main()
函数之上。编译器需要知道函数才能调用它。
或者,您可以在main
上方forward-declare 在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++ 关键字。
【讨论】:
最后一个问题的解决方案很简单:使用 C 编译器编译 C 代码。 @KeithThompson:不错,但是我看到很多人使用 C++ 编译器编译 C 代码。 我还是不明白。为什么它可以与 int 作为参数一起使用,但不能与两个 int 和一个 char 一起使用?如果是我还没有声明,那我不应该也收到错误信息吗? @user1661303:这与以下事实有关.这就是错误的第二行告诉您的内容。从该错误看来,隐式声明有一个空参数列表,这意味着该函数的参数数量(和类型)未指定。可能是函数是可变参数的,在这种情况下,char
参数将被提升为 int
。【参考方案3】:
当编译器看到您对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
的值,但你有一个好的开始。)
【讨论】:
感谢大家的快速回复。我会试试看。我也想知道这个 void 函数是 int。 c 不是设计得尽可能小并且占用内存尽可能少吗?那么为什么让所有 void 函数都返回一个 int 有意义呢?这不会使函数使用比它需要的更多的内存吗?我正在使用 gcc,它会尝试编译 c++ 关键字还是安全? @user1661303:不,void
函数不是 int
。定义为返回 void
的函数不返回结果。定义为返回 int
的函数返回 int
结果。 在 1999 年标准之前,没有显式类型的函数会隐式返回 int
,因此 func();
和 int func();
是等效的声明。 (在 1989/1990 标准之前,没有 void
关键字。) 1999 标准删除了这个“隐式 int”规则,因此省略类型不再合法;如果一个函数返回int
,你必须明确地说出来。这与内存占用无关。
所以如果我理解正确的话,在 1989 年标准之前,你不能有一个没有返回值的函数吗?这是否会使内存占用更大,因为您必须返回一个 int,即使函数本身不需要发送返回值?对不起,新手的问题。
@user1661303:这取决于实现,尤其是函数调用约定。每个函数调用的单个int
对象的开销通常足够小,不值得担心。 (请注意,在 1989 年之前,该语言没有正式的标准;K&R 的第一版是事实上的标准。)【参考方案4】:
你必须告诉编译器关于函数calculate的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;
【讨论】:
请注意,参数名称在原型中是可选的(这不是定义的一部分)。换句话说,你可以写int calculate(int, int, char);
,但你也可以写int calculate(int number1, int number2, char operator);
。恕我直言,更明确的形式更好。以上是关于在 c 中将 char 作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章