写点什么

C 语言编程语法—语法风格

作者:向阳逐梦
  • 2023-06-16
    四川
  • 本文字数:2423 字

    阅读完需:约 8 分钟

C语言编程语法—语法风格
#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; }
复制代码


发布于: 2023-06-16阅读数: 17
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022-06-01 加入

某公司芯片测试工程师,嵌入式开发工程师,InfoQ签约作者,阿里云星级博主,华为云·云享专家。座右铭:向着太阳,追逐梦想!

评论

发布
暂无评论
C语言编程语法—语法风格_C语言_向阳逐梦_InfoQ写作社区