二:C语言复习基础--函数
一:函数的声明和定义
//1.函数声明(参数变量可省略) 返回值类型 函数名(参数类型 参数,参数类型 参数,...); //2.函数定义 返回值类型 函数名(参数类型 参数,参数类型 参数,...) { 语句; return 返回值; } //3.参数类型存在隐式转换 int fun(int c,int b) { printf("%d,%d\n",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.遇到回车'\r'或换行'\n' //3.调用fflush手动刷新缓冲区 //4.调用scanf要从输入缓冲区中读取数据,所以也会将输出缓冲区内容刷新
2.scanf函数使用