重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
c函数是一个独立的程序段,它执行具体的、明确的任务
成都创新互联主营白银区网站建设的网络公司,主营网站建设方案,App定制开发,白银区h5小程序定制开发搭建,白银区网站营销推广欢迎白银区等地区企业咨询
特点:
一个函数只能返回一个值
一个程序可以有一个或多个函数
函数可以嵌套调用,但不能在一个函数中定义另一个函数
无论函数是否有参数,一定要有括号
函数在定义或使用前应在main() 函数中进行声明
一个函数的参数的数目没有明确的限制,但是参数过多(例如超过8个)显然是一种不可取的编程风格。参数的数目直接影响调用函数的速度,参数越多,调用函数就越慢。另一方面,参数的数目少,程序就显得精练、简洁,这有助于检查和发现程序中的错误。因此,通常应该尽可能减少参数的数目,如果一个函数的参数超过4个,你就应该考虑一下函数是否编写得当。 如果一个函数不得不使用很多参数,你可以定义一个结构来容纳这些参数,这是一种非常好的解决方法。在下例中,函数print_report()需要使用10个参数,然而在它的说明中并没有列出这些参数,而是通过一个RPT_PARMS结构得到这些参数。 # include atdio. h typedef struct ( int orientation ; char rpt_name[25]; char rpt_path[40]; int destination; char output_file[25]; int starting_page; int ending_page; char db_name[25]; char db_path[40]; int draft_quality; )RPT_PARMS; void main (void); int print_report (RPT_PARMS* ); void main (void) { RPT_PARMS rpt_parm; /*define the report parameter structure variable * / /* set up the report parameter structure variable to pass to the print_report 0 function */ rpt_parm. orientation = ORIENT_LANDSCAPE; rpt_parm.rpt_name = "QSALES.RPT"; rpt_parm. rpt_path = "Ci\REPORTS" rpt_parm. destination == DEST_FILE; rpt_parm. output_file = "QSALES. TXT" ; rpt_parm. starting_page = 1; rpt_pann. ending_page = RPT_END; rpt_pann.db_name = "SALES. DB"; rpt_parm.db_path = "Ci\DATA"; rpt_pann. draft_quality = TRUE; /*call the print_report 0 function; paaaing it a pointer to the parameteM inatead of paMing it a long liat of 10 aeparate parameteM. * / ret_code = print_report(cu*pt_parm); } int print_report(RPT_PARMS*p) { int rc; /*acccM the report parametcra paaaed to the print_report() function */ oricnt_printcr(p-orientation); Kt_printer_quality((p-draft_quality == TRUE) ? DRAFT ; NORMAL); return rc; } 上例唯一的不足是编译程序无法检查引用print_report()函数时RPT_PARMS结构的10个成员是否符合要求。
编译器编译命令里有设置选项,通过设置,你可以要求 不优化,也可以要求用哪种优化。
具体选项有哪些,要查自己编译器的帮助文件。
例如,MS VC++ 6.0 编译器编
优化选项:
/O1:优化使产生的可执行代码最小
/O2:优化使产生的可执行代码速度最快
/Oa:指示编译器程序里没有使用别名,可以提高程序的执行速度
/Ob:控制内联(inline)函数的展开
/Od:禁止代码优化
/Og:使用全局优化
/Oi:用内部函数去代替程序里的函数调用,可以使程序运行的更快,但程序的长度变长
/Op:提高浮点数比较运算的一致性
/Os:产生尽可能小的可执行代码
/Ot:产生尽可能块的可执行代码
/Ow:指示编译器在函数体内部没有使用别名
/Ox:组合了几个优化开关,达到尽可能多的优化
/Oy:阻止调用堆栈里创建帧指针
/O2 为了加速,会优化掉。 选 /Od 不优化。
优化0:题目要求输入学生个数上限,所以输入n那里需要验证。
优化1:减少循环次数,题目没有说找最大最小必须单独循环。那么直接在输入循环的时候就能得结果。
优化2:你的j每次只循环一次,没有必要。
优化3:输入那里用临时变量传递,没必要,直接用数组地址。
优化4:数组最大值定义常量,便于后期程序修改参数。
下面代码,我完全按照你的写法写的,你拿来参考。(要是学过指针,比大小那里试试换成指针更好)
#include stdio.h
#define MS 40//最大学生人数
int main()
{
int n=0,i;
int a[MS][2];
int minmark,maxmark,minxuehao,maxxuehao;
while(!n || nMS)
printf("请输入学生数量:"),scanf("%d",n);
for(i=0;in;i++)
{
printf("请输入学生学号:");
scanf("%d",a[i][0]);
printf("请输入学生成绩:");
scanf("%d",a[i][1]);
if(i==0)
minmark=maxmark=a[0][1];
else{
if(minmarka[i][1]) minmark=a[i][1],minxuehao=a[i][0];
if(maxmarka[i][1]) maxmark=a[i][1],maxxuehao=a[i][0];
}
}
printf("最高分为%d,学号为%d\n",maxmark,maxxuehao);
printf("最高分为%d,学号为%d\n",minmark,minxuehao);
return 0;
}
编译器根据对代码进行优化的需要自行规定对实参的求值顺序。有的编译器规定自左至右,有的编译器规定自右至左,这种对求值顺序的不同规定,对一般参数来讲没有影响。但是,如果实参表达式中带有副作用的运算符时,就有可能产生由于求值顺序不同而造成了二义性。你的编译器是自右向左的顺序。
以下内容摘自李亚锋先生的《经典C面试真题精讲》
1.结构体设计为成员最长类型长度的整数倍;
2.减少函数参数的个数,不需要返回值的函数定义为void类型;
3.if...else....多条件分支语句中,把出现频率高的条件放在前面;
4.同时声明多个相同类型变量优于分别单独声明变量;
5.减少定义全局变量;
6.使用#define定义常量和小的函数实现;
7.有些情况嵌套汇编语句效率更高;
8.占用大的存储空间可以减少执行时间,同理时间也可以换取空间;
9提高程序算法效率;