重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
C语言是一门非常流行的编程语言,被许多平台选用,具有许多的优点。然而,正如人们常说的“事物都具有矛盾性”,有利必有弊,在看到其种种优点之时,千万不要忽视其存在的不足和缺陷。下面的分析不是为了打击大家学习 C语言的积极性,而是为了使大家更好地了解和学习 C语言。
凯里ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!
(1)C语言语法限制不太严格,程序设计自由度大。“限制”与“灵活”是对立的,强调“灵活”就会放松“限制”。这就对使用 C语言进行编程提出了更高的要求,程序员要对程序设计更熟悉。例如, C语言对数组下标越界不检查,容易造成数据在内存中的混乱。
(2)C语言具有丰富的运算符,多达 34种。丰富的数据类型与丰富的运算符相结合,使 C语言具有表达灵活和效率高等特点。然而,这却增加了使用 C语言的难度,这些运算符分为众多优先级,不容易记忆,可能混淆而产生错误。
(3)C语言存在着一些不应该存在的语法限制。例如, switch语句由 case结构组成,每个 case结束之后都要使用一个 break来跳出 case结构,否则将会继续执行下面的 case,这样就会造成错误。
(4)C语言中许多运算符被“重载”,具有不同的意义,甚至有些关键字也具有好几种意义。例如, void作为函数的返回类型,表示不返回任何值;在指针声明中,表示通用指针类型;在参数列表中,表示没有参数。
首先讲一下函数调用,C语言函数调用的过程是:
①将参数压栈,一般是从右往左。
②使用call指令,调用函数。call指令会将当前指令所在的内存位置压栈以便函数结束后返回。
③进入函数体(跳转到另一块内存中),执行,执行完后,使用通用寄存器或者栈来存储返回值,使用ret指令返回。
可以看到,函数调用是发生了跳转的,考虑一下跳转大小和指令预取这些东西,调用函数会加长执行时间。如果只是调用几次,时间差异可能感觉不出来,不是特别情况也不需要在乎。但函数被反复调用时,性能就会差很多。
所以有了内联函数这玩意,编译器会直接将对内联函数的调用扩展为整个函数的代码(几种情况除外,这个看书,我也记不住),也就是说,不会使用call和ret指令。所以,这样做的缺点就是每个调用函数的位置都被扩展成了函数的代码,会加大生成的可执行文件的大小。所以才会提倡,将调用频繁而函数本身却很小的函数声明为内联函数。
它们的区别就在这里,跳转和不跳转,牺牲时间还是牺牲空间。
1.内联函数可减少cpu的系统开销,并且程序的整体速度将加快,但当内联函数很大时,会有相反的作用,因此一般比较小的函数才使用内联函数.
2.有两种内联函数的声明方法,一种是在函数前使用inline关见字,另一种是在类的内部定义函数的代码,这样的函数将自动转换为内联函数,而且没必要将inline放在函数前面.
3.内联是一种对编译器的请求,下面这些情况会阻止编译器服从这项请求.
如果函数中包含有循环,switch或goto语句,递归函数,含有static的函数.
由此可以看出,内联函数和成员函数没什么区别,区别就在于怎样加快函数的执行速度而已。
速度是有代价的,inline和宏都是用空间换时间。
使用内联函数的时候要注意:
1.递归函数不能定义为内联函数
2.内联函数一般适合于不存在while和switch等复杂的结构且只有1~5条语句的小函数上,否则编译系统将该函数视为普通函数。
3.内联函数只能先定义后使用,否则编译系统也会把它认为是普通函数。
4.对内联函数不能进行异常的接口声明。
c语言的优点就是它的性能极佳,其它编程语言几乎没有它的性能,因此它被用为linux操作系统设计语言。
c语言的缺点是太灵活,没有垃圾回收,代码不好编写。
c语言特别之处就是它的指针和结构体,这两个东西的存在让c语言变得异常强大,很多复杂的业务设计,都可以通过它们两个来实现,也可以说,只有掌握了指针和结构体,你才算入门c语言。
应该是c++中才有的, inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。 表达式形式的宏定义一例: #define ExpressionName(Var1,Var2) (Var1+Var2)*(Var1-Var2) 2.这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。 3.在C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。 4. inline 推出的目的,也正是为了取代这种表达式形式的宏定义,它消除了它的缺点,同时又很好地继承了它的优点。 对应于上面的1-3点,阐述如下: 1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。 2.很明显,类的内联函数也是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。 3. inline 可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。 在何时使用inline函数: 首先,你可以使用inline函数完全取代表达式形式的宏定义。