一:函数的声明和定义
//1.函数声明(参数变量可省略)
返回值类型 函数名(参数类型 参数,参数类型 参数,...);
//2.函数定义
返回值类型 函数名(参数类型 参数,参数类型 参数,...)
{
语句;
return 返回值;
}
//3.参数类型存在隐式转换
int fun(int c,int b)
{
printf("%d,%d
",c,b);
double a=100.09;
return a;
}
int main()
{
double a=fun(1.9,2.3);
printf("%f",a);
}
二:main函数的始终
1.main函数的三种形式
//无参
int main();
//参数个数和参数列表
int main(int argc,char *argv[]);
//参数个数和参数列表、环境变量列表
int main(int argc,char *argv[],char *envp[]);
2.main函数原理
C90标准中,规定了执行环境,对于没有操作系统的环境,入口地址是什么都可以。对于有操作系统的环境中,链接器会把main函数和另外的启动程序链接,而启动程序会引用你写的main函数
#include<stdio.h>
int print()
{
printf("helloworld");
return 0;
}
//编译参数:gcc test.c -e print nostartfiles
//运行结果:helloworld
三:可变参数与printf和scanf函数
1.函数的可变参数
//stdarg.h提供va-list数据类型和三个宏(va-start、va-arg和va-end)。实现函数可变参数:printf和scanf函数。
#include<stdarg.h>
#include<stdio.h>
int my_print(const char *format,...)
{
char c=0;
int value_num=0;
va_list vp;
va_start(vp,format);
while(*format)
{
c=*format;
switch(c)
{
case '%':
{
char cc=*(++format);
switch(cc)
{
case 'd':
{
printf("%d",va_arg(vp,int));
value_num++;
break;
}
case 'f':
{
printf("%f",va_arg(vp,float));
value_num++;
break;
}
case 'l':
{
char *temp=format;
char ccs=*(++temp);
if(ccs=='f')
{
printf("%lf",va_arg(vp,double));
value_num++;
}
if(ccs=='d')
{
printf("%ld",va_arg(vp,long long int));
value_num++;
}
break;
}
case 'c':
{
putchar(va_arg(vp,char));
value_num++;
break;
}
case 's':
{
printf("%s",va_arg(vp,char*));
value_num++;
break;
}
default:
{
break;
}
}
}
default:
{
printf("%c",c);
break;
}
}
format++;
}
va_end(vp);
}
2.scanf函数和printf函数使用详解
1.printf函数使用
int printf(const char *format,...);
//返回值:正确输出的字符总数,错误则返回负值,且输入输出流错误标志(ferror)
//调用格式:printf("格式化字符串",输出列表);
//格式化字符串:转义字符、字符串常量、格式控制字符串
//%[flags][width][.prec][length]type
//type:整形(%d),无符号8进制(%o),无符号10进制(%u),无符号16进制(%X),百分号(%%),单精度(%f),双精度(%lf),此前输出的字符数(%n),打印error内容(%m)
//flags:左对齐(-),输出符号(+),(正值为空格负值加上负号)(空格),输出的前面补0(0)
//printf实现是行缓冲,下面情况时会刷新缓冲区:
//1.缓冲区填满
//2.遇到回车'
'或换行'
'
//3.调用fflush手动刷新缓冲区
//4.调用scanf要从输入缓冲区中读取数据,所以也会将输出缓冲区内容刷新
2.scanf函数使用