#include <stdio.h>
int main(void)
{
printf("That is Right Style\n");
return 0;
}
在一个规范的C言语程序中,最特别的莫过于main函数了,而说到底它便是一个函数罢了,仅仅由于它地位特别拥有第一履行权利,换句话说,莫非由于一个人是省长它就不是人类了?所以函数该有的它都应该有,那么函数还有什么呢?
函数大体上分为内联函数(C99)(内联函数并非C++专属,C言语亦有,详细见前方链接)和非内联的一般函数,它们之间有一个很明显的特色(一般状况下),那便是不写原型直接在main函数上方界说,即使不加’inline’关键字,也能被编译器默以为内联函数,但之后带来的某些并发问题就不是编译器考虑的了。
一般函数正确的方式应该为声明与界说别离,声明便是一个函数原型,函数原型应该有一个函数姓名,一个参数列表,一个返回值类型和一个分号。界说便是函数的内涵,花括号内的便是函数的界说:
//...
int function(int arg_1, float arg_2);
//...
int main(int argc, char* argv[])
{
int output = function(11, 22.0);
printf("%d\n",output);
return 0;
}
int function(int arg_1, float arg_2)
{
int return_value = arg_1;
float temp_float = arg_2;
return return_value;
}
依上所述,当非必要时,在自己编写函数的时分请注意在最初(main函数之前)写上你的函数的原型,而且在末尾(main函数之后)写上你的函数界说,这是一个很好的习气以及规范。所谓代码整洁之道,便是如此。
函数的另一种分类是,有返回值和无返回值,返回值的类型可所以内建(build-in)的也可所以自己界说的(struct, union之类),无返回值则是void。
为什么咱们非常谴责void main()这种写法?由于这完全是中国式教育延伸出来的谭式写法,main函数的返回值看似无用,实际上是由操作体系接纳,在Windows操作体系下也许无甚”大碍”(实际上有),当你运用Linux的过程中你会明晰的发现一个C言语程序的main返回值关系到一个体系是否能正常,高效的运行,这里略微提一句,0在Linux程序管道通讯间代表着无错可行的意思。所以请扔掉void main这种写法。为什么咱们对 main()这种省略返回值的写法置有微词?能发明这种写法的人,必定是了解了,在C言语中,如果一个函数不显式声明自己的返回值,那么会被缺省以为是int,但这一步是由编译器掌控,可是C言语设计之初便是让咱们对一切尽可能的把握,而一切不确定因子咱们都不应该让它存在。其次有一个原则,能自己做的就不要让编译器做。
为什么咱们对参数放空置有不满(int main())?在C言语中,一个函数的参数列表有三种合法形状:
int function();
int function(void);
int function(int arg_n);
int function(int arg_n, ...);
第一种代表拥有不知道个参数,第二种代表没有参数,第三种代表有一个参数,第四种代表拥有不知道个参数,而且第一个参数类型为int,不知道参数在C言语中有一个解决方案便是,可变长的参数列表,详细参考C规范库,在此咱们解释的依据便是,咱们要将一切都掌控在自己的手中,咱们不在括号内填写参数,代表着咱们以为一开始的意思是它为空,正因而咱们就应该明确说明它为void,而不应让它成为一个不知道参数长度的函数,如此在你不小心传入参数的时分,编译器也无法发现过错。
int main(int argc, char* argv[]) 和 int main(void)才是咱们该写的C言语规范方式关于缩进,除了编译器提供的符号缩进之外,咱们可以自己给自己一个规范(请少用或许不必Tab),比如每一块代码相教上一个代码块有4格的缩进。关于学习C言语,请运用.c文件以及C言语编译器操练以及编写C程序,请不要再运用C++的文件编写C言语程序,而且无懈可击为了效率而运用C++的特性在C言语中,咱们是祖国的下一代,是祖国的未来,请不要让自己毁在当下,喜爱编程,远离清华大学出版社。
之所以如此叙说,并不是由于情绪,而是确实如此,下方代码:
/*file: test.c*/
#include <stdio.h>
#define SIZES 5
int main(void)
{
int* c_pointer = malloc(SIZES * sizeof(int));
/*发生了一些事情*/
free(c_pointer);
return 0;
}
这是一段规范的C言语程序,可是它能在C++个编译器下编译运行吗?换句话说当你将文件扩展名由.c改为.cpp之后,它能编译经过吗?答案是不能。
为什么?答案是C++并不支持void*隐式转换为其他类型的指针,可是C言语答应。还有许许多多C于C++不相同的当地,也许有人说C++是C的超集,但我并不这么以为,一门言语的出现便有它的意义所在,关键在于咱们如何发挥它的最大优势,而不是经过混杂概念来增强实用性。
程序式子的写法
一个人活在世界上,时时刻刻都注意着自己的言行举止,而写程序也是如此,关于一个规范的能让他人读懂的程序而言,咱们应该尽可能减少阻碍因子,例如:
int main(void)
{int complex_int=100;
int i,j,k,x;
for(int temp=0;temp<complex_int;++temp){k=temp;
x=k+complex_int;}
printf(complex_int="%d is k=%d x=%d\n",complex_int,k,x);
return 0;}
关于上述的代码,我总是在班级里的同学手下出现,但这段代码除了让他人困惑以外,自己在调试的时分也是非常不方便,常常遇到问题了,即便IDE提示了在某处过错,你也找不到问题所在,经常有人来问我哪里错了,大部分状况都是少了分号,括号,或许作用域超越,原因在哪?
要是一开始将代码写清楚了,这种状况简直是凤毛麟角,想遇上都难。关于一个代码而言,咱们应该注意让其变得明晰。
等号两头运用空格:
int complex_int = 100;
关于一个明晰的程序而言,咱们要让每一个步骤明晰且有意义,这就要求咱们在编写程序的时分尽量能让代码看起来结构化,或许全体化。尽量让每个程序式子为一行,如果有特别的需要让多个式子写在同一行,可以运用,操作符进行组合,可是会让程序更难理解,日后调试的时分也更难发现过错。
/*Style 1*/
for(int temp = 0;temp < complex_int;++temp)
{
k = temp;
x = k + complex_int;
}
/*Style 2*/
for(int temp = 0;temp < complex_int;++temp){
k = temp;
x = k + complex_int;
}