这里是limou3434的一篇博文,感兴趣的话您可以看看我的其他文章。
在C语言中,最重要的概念实际上是函数,因为函数最能体现C语言模块化、面向过程的特征。
本次我会和您探讨一些函数的编码规范、一些函数的设计原则和技巧.
int main()
{
//变量定义
int a = 0;
int b = 0;
int c = 0;
//函数内的其他代码语句
for(int i = a; i < 5; i++)
{
printf("%d %d\n", b++, c++);
}
return 0;
}
while(某些条件){
巨长的代码
if(){
巨长的代码
if(){
巨长的代码
}//end of if1
}//end of if2
}//end of while
if(条件1
&& 条件2
&& 条件3
&& 条件4)
{
//具体代码
}
void my_strcpy(char *strSource, char *strDestination);
//这样对于程序员,哪怕是没有查看函数定义,也会下意识的认为该函数是右边字符参数拷贝给左边参数,因此就会下意识写出下面这样的代码,这是普遍认可的主流写法
char str[20];
my_strcpy(str, "hello word!");
5.1.需要注意的是assert也不要过于滥用,这是因为assert只有在Debug中才是有效的,如果是在Release模式下,assert就会被编译器自动去掉(如果经过测试就会发现两个模式下的报错是不太一样的,原因就是assert被去掉了)。而这样如果用户在使用Release模式时候,一旦发生错误就没有assert来提示错误(这就相当于测试代码的时候四处使用assert防备,而真正到了使用代码的时候这些防备反倒是全部卸去了…)
5.2.使用assert还有一个问题,有的时候就要给函数传递空指针,比如“树的前序遍历”中就需要传递NULL来停止递归,而不是直接简单除暴使用assert来终止整个程序
//例如strcpy函数,
char* strcpy(char* strDest, const char* strSrc);
//链式使用函数
char str[20];
int length = strlen(strcpy(str, "helood word!"));
//例如strcpy函数,
char* strcpy(char* strDest, const char* strSrc);
//链式使用函数
char str[20];
int length = strlen(strcpy(str, "helood word!"));
//这样可以,但是可读性低
int arr1[3][2] = { 1, 2, 3, 4, 5, 6 };
//这样写可读性高
int arr2[3][2] = { {1, 2}, {3, 4}, {5, 6} }
//有的时候在函数体内写二元判断表达式如下
int function(int a)
{
if(a > 0)
{
printf("a = %d\n", a);
}
else
{
printf("非正数\n");
}
}
//改写成下面这种方式会更好,更加确保每个控件路径一定会有返回值
int function(int a)
{
if(a > 0)
{
printf("a = %d\n", a);
}
printf("非正数\n");
}
#include
int main()
{
int arr1[3] = { 1, 2, 3 };
int arr2[4] = { 0, 0, 0, 0 };
int* p1 = arr1 + 1;
int* p2 = arr2 + 2;
printf("%zd", p2 - p1);//编译器不会报警!这种结果是不可预知的
return 0;
}
“errno做为C的简捷工具,在理论上是有用的,但在实际中标准没有很好地定义它。一个非零值可以指示问题的发生,也可以不用它指示;做为结果不应该使用它。即使对于那些已经良好定义了errno的函数而言,宁可在调用函数前检查输人值,也不依靠errno来捕获错误。”——来自《C语言深度解剖》