我在c中练习这个功能并且遇到了这个程序......
#include<stdio.h>
int main()
{
float a=15.5;
char ch ='C';
printit(a,ch);
return 0;
}
printit(a,ch)
{
printf("%f\n%c",a,ch);
}
我想知道为什么上面的程序编译而不是像我目前所理解的那样给出错误...
c中的函数必须使用特定原型声明(但此程序不包含原型)
为什么程序给char变量输出'x'?
c中的函数是否能够接受该值而不被声明参数中的类型,如函数声明中所做的那样?
答案 0 :(得分:4)
首先,C语言中没有要求在调用函数之前为函数提供原型。在C99版本的语言中,需要在调用之前声明一个函数,但仍然没有要求提供原型。
由于您的编译器没有抱怨,您必须使用C89 / 90编译器,而不是C99编译器。
其次,在C89 / 90中,当您调用未声明的函数时,将像在
中一样传递float
和char
类型的参数
printit(a,ch);
编译器将执行默认参数提升,并实际传递double
和int
类型的值。必须相应地定义您的函数才能使代码生效。您将函数定义为
printit(a, ch)
{
...
该定义意味着两个参数都具有类型int
。这违反了上述要求。代码的行为未定义。再进一步分析代码或猜测为什么它以打印方式打印出来的东西再也没有任何意义。您的代码的行为再次未定义。
(未声明的)函数的正确定义可能如下所示
int printit(double a, int ch)
{
...
或者,它可以用K&amp; R样式定义为
printit(a, ch)
float a;
{
...
这可能会使您的代码正常工作。但是,更好的方法是在调用之前为printit
提供原型。您要使用哪种原型 - void printit(double a, int ch)
或void printit(float a, char ch)
或其他 - 供您决定。
答案 1 :(得分:2)
答案 2 :(得分:0)
void printit(float a, char ch) {
printf("%f\n%c",a,ch);
}
int main()
{
float a=15.5;
char ch ='C';
printit(a,ch);
return 0;
}
答案 3 :(得分:0)
该代码几乎肯定会读到:
#include <stdio.h>
void printit(float a, char ch);
int main()
{
float a=15.5;
char ch ='C';
printit(a,ch);
return 0;
}
void printit(float a, char ch)
{
printf("%f\n%c\n",a,ch);
}
如果你想整齐地写它。但是,要解决上述问题:
1)你应该包括一个原型,是的。但是,由于您只编译一个单元(.c文件),编译器可以非常轻松地确定您的函数所在的位置,因此您的意思是什么。我明白了:
test.c:11: warning: conflicting types for ‘printit’
test.c:7: note: previous implicit declaration of ‘printit’ was here
我强烈建议使用-Wall -Werror -pedantic
进行编译,将此类警告转换为错误并中止编译,从而强制您编写正确的代码,以便以后减少错误。
2)我在新线上得到15.5然后是C。我不确定Z的来源。
3)您不必指定类型 - 但是,如果不这样做,您将无法从编译器中获益,如果类型不兼容则会发出警告。一个非常常见的情况是将数据传递给汇编。这不是严格需要的,但它可能违反了标准C,绝对不是最佳做法。
答案 4 :(得分:0)
问题1:printit
是在main
之后定义的,解决方案是将函数原型放在顶部。
问题2:正确声明函数原型,(你没有写返回和参数类型)
解决方案:
#include <stdio.h>
void printit(float a, char ch);
int main()
{
float a=15.5;
char ch ='C';
printit(a,ch);
return 0;
}
void printit(float a, char ch)
{
printf("%f\n%c",a,ch);
}