C语言的优点和缺点
C语言的优点和缺点有哪些
C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。下面小编为大家带来C语言的优点和缺点,欢迎大家参考阅读,希望能够帮助到大家!
C语言的优点
1.简洁紧凑、灵活方便
C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C语言可以象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
2.运算符丰富
C的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C的运算类型极其丰富,表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。
3.数据结构丰富
C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等,能用来实现各种复杂的数据类型的运算,并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能,支持多种显示器和驱动器,且计算功能、逻辑判断功能强大。
4.C是结构式语言
结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
5.C语法限制不太严格,程序设计自由度大
虽然C语言也是强类型语言,但它的语法比较灵活,允许程序编写者有较大的自由度。
6.C语言允许直接访问物理地址,可以直接对硬件进行操作
因此既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可以用来写系统软件。
7.C语言程序生成代码质量高,程序执行效率高
一般只比汇编程序生成的目标代码效率低10へ20%。
8.C语言适用范围大,可移植性好
C语言有一个突出的优点就是适合于多种操作系统,如DOS、UNIX,也适用于多种机型。
C语言的缺点
1.C语言的缺点主要是表现在数据的封装性上,这一点使得C在数据的安全性上做的有很大缺陷,这也是C和C++的一大区别。
2.C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。
C语言基础知识
1.C语言中,变量必须先声明后使用,即一个程序块(花括号对)中所有临时变量必须在第一条可执行语句之前全部声明,而不能像C++那样随用随声明;
2.C语言中参数传值传递形参,即为参数的拷贝,此与C++/JAVA相同,同时值得注意,ANSI C不支持引用,此与C++/JAVA有区别,那么要对参数进行修改只能使用指针方式(指针传值指针本身仍是形参,要修改指针本身那必须使用双重指针);
3.C语言默认类型为int,即参数无类型或函数无返回值类型声明,则认为是int(貌似一些编译器不支持),同时不建议使用该特性;
4.无参数的函数声明应当使用void表明,否则C语言按照老式声明方法忽略参数类型检查;
5.全局变量建议全大写,局部变量建议全小写,内部变量31个字符有效,外部变量不区分大小写,仅6个字符有效,所以必须保持唯一性;
6.ANSI C是按照多字节实现的,UNICODE是后来发展的,所以有char/WCHAR,与.NET中char直接是双字节有区别,在C#中导入dll时值得注意;
7.C语言支持枚举,并且枚举和int直接强制类型转换即可,比.NET方便;
8.#define声明宏定义直接在编译时替换,不进行类型检查,const声明常量则可以进行类型检查;
9.运算符的优先级记忆比较麻烦,还是()可靠;
10.goto并不是一无是处,在不考虑程序可读性的情况下可能获得更高的效率;
11.函数实际也可以与特殊的类型相对应,那样对于理解函数指针比较方便,函数为外部类型;
12.static用于全局变量和函数则限定该变量和函数的使用范围仅为该源文件(从而无需考虑与其他源文件不得重名),用于函数内部变量则该变量的内存分配和回收不再同于普通临时变量(调用函数生成,函数返回销毁),而是一直存在于静态变量区,从而可以保存一些状态;
13.头文件的作用体现在调用其他源文件时不需要再次写函数定义,所以实现函数是不需要头文件的,调用时才需要,可以采用富头文件定义一大组接口,然后使用多个源文件分别实现;
14.寄存器变量使用register声明,仅适用于使用频率高的局部变量(含形参)(受限于底层硬件,不一定会被分配到寄存器,但是这么写不影响效率);
15.全局变量和静态变量默认初始化为全零且仅初始化一次,局部变量默认初始化为未定义且每次都会重新初始化;
16.递归调用的方法一般比较紧凑,但是每次调用会单独维护调用的堆栈,所以效率不是最高;
17.#include的作用体现于将一些内容避免重新写一遍(主要是类型、函数和外部变量定义),所以实际上不一定为h文件;
18.表示一行尚未结束,对于定义长的字符串和define比较有用;
19.函数调用的执行顺序不确定,所以对于a()+b()这样函数中使用相同变量并且改变其值的需要借助临时变量处理,防止不同实现的调用顺序不一致;
20.##用于宏定义中连接前后两个部分,如cat(a, b) a ## b;
21.指针是C/C++的'重要内容,当然也是双面刃,用好了很方便而且高效,用不好那就造成程序不稳定;
22.使用va_list, va_start, va_arg, va_end来定义可变参数的函数,通过va_start函数中的第一个不变参数将va_list指向参数列表(函数调用的栈中),然后通过va_arg获取每个参数并将va_list移动指定类型的长度,最后则通过va_end完成必要的回收工作,需要指出的是va_arg没有结束边界,所以比较有效的方式有两种,一种对于参数类型一致,则可以第一个参数指出后续参数的总数,然后依次获取,另一种对于不同类型的参数混用,则可以通过类型标识+参数配对的方式进行使用(第一个参数依然可以指定数量,当然也可以检查标识),从而避免最后读取无效的参数,对于可变参数仅支持int和double两种类型(参数未限定类型,故按照旧式声明理解)以及指针类型;
23.函数指针是用来在C语言中实现动态调用的比较有效的方式
24.结构体用作参数依然是拷贝为形参传递,这点与JAVA中全部对象都是类有区别(类的对象通过引用传值,C#支持struct),所以对于大的结构体事宜使用指针传递,而对于小的结构体拷贝传值效率并不低;
25.代码中字符数组为静态常量,对其操作无效,程序块中数组的声明是可以自动回收的,通过malloc/calloc分配的内存为堆内存,需要自行通过free回收;
c语言的就业方向
就业方向
随着软件专业化分工的加快,分工会越来越细,就业种类也就越来越多了。
面对各种就业种类,如何去选择倒是一个仁者见仁智者见智。
只有先定下来就业方向,然后根据就业方向所要求的必须掌握的语言,确定自己要学的.语言。
例如,你想去做后台的编程工作,你就可能会选择C语言、数据库等。
如果你想去编写网站,你就会在C#、JAVA、PHP中进行选择。
如果你想去做底层与硬件有关的编程,你就会去学习汇编和专业的单板机语言。
社会资源
就已经工作过的人来说,就业还取决于个人的社会资源,假如你有足够的社会资源,你就可能想到哪就到哪。
这种个别的现象不在我讨论的范围之内。
其他的个人的社会资源例如学校、家庭、朋友、朋友的朋友,其他求职中介和求职渠道,都是你求职重要因素。
例如,你的朋友正好在一家软件公司,而这家软件公司正好要招聘你这种程序员,往往求职会很快成功。
因此,将目光放在你的社会资源上,看看他们能够触及的单位,然后,了解这些单位对程序设计语言的要求,再进行语言的准备还是非常有必要的。
个人基础
当然,通过各方面考量,最终选择了就业方向,也就确定了你的程序设计语言。
这个语言可能你在学校学过的,也可能没有学过。
对于你来说都要有一个重新学习的阶段。
这个学习阶段和大学里无忧无虑的学习有着本质的不同,这可是关系到你能否被用人单位录用,关系到你今后生存、关系到你今后的职业生涯的规划。
因此,你不但要把用人单位所需要的程序设计语言学好,而且要把相关的其他语言学好,相关的其它计算机基础知识学好。
这样才能把你的个人编程基础打扎实,基础是必须的。