在 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-declaremain() 之前添加这一行:

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 作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

在函数c ++中将变量作为默认参数传递[重复]

在C代码中将结构体变量作为参数传递效率忒低

在 C 中将多维数组作为参数传递

无法在 C/C++ 中将 TCHAR 作为参数传递

如何在C中将函数指针数组的函数指针作为函数参数传递?

在 C/C++ 中将数组作为形式参数传递为 int arr[] 和 int arr[N] 之间的区别