14-基本的C语言特性
最后更新于:2022-04-01 00:17:25
这里介绍一些特性,在编写Objective-C程序时不一定需要了解。
事实上,这些大部分来源于相关联的基本的C语言特性,
虽然C语言是一门过程式语言,其中的一些特性与面向对象编程的思想是对立的,
但是语言是思想也是工具,在其中找到二者关联和差异,会对Objective-C有更深入的理解。
#### 数组:
定义一组有序的数据项,即数组。
如果在字符数组结尾添加一个终止空字符(‘\0’),就产生了一个通常称为字符串的变量。
和其他变量类型一样,必须在使用之前先声明数组,
数组的声明涉及声明数组所包含元素的数值类型,以及将存储在数组中的最大元素数目。
#### 函数:
如果使用了自动引用计数(ARC),那么每次调用函数(方法)时,局部对象的变量都会默认初始化为空。
在函数中(和在方法中一样)定义的变量称为自动局部变量。
因为每次调用该函数后,它们都自动“创建”,并且它们的值对于函数来说是局部的。
函数和方法:函数是指非对象的过程调用,方法是指对象的过程调用。
函数默认的返回类型与方法默认的不同。
如果没有为方法指定返回类型,编译器就会假设它返回id类型的值。
同样,应该为方法声明返回类型,不要依赖这个事实。
函数的默认返回值是整型值。
调用函数或方法时,作为参数传递的值将被复制到相应的形参中。
使用数组时,并非将整个数组的内容复制到形参数组中,
而是传递一个指针,它表示数组所在的计算机内存地址。
所以,对形参数组所作的所有更改实际上都是对原始数组而不是数组的副本执行的。
因此,函数或方法返回时,这些变化仍然有效。
块Blocks:
块对于c语言是一种扩展。
它并没有作为标准ANSI C所定义的部分,而是APPLE公司添加到语言中的。块
看起来更像是函数。
一般来说,块是不能改变外部的变量的,除非使用_ _block int num = 0;这样修饰的变量。
块的其中一个优势在于能够让系统分配给其它处理器或应用的其它线程执行。
简言之:线程安全的。
**不建议使用,不是标准的东西,当对程序进行移植时,就会显现出很不方便。**
指针:
C语言里的重要特性,面试必考,工作必用。
指针可以高效地表示复杂的数据结构,更改作为参数传递给函数和方法的值,
并且能更准确、高效的处理数组。
字符串常量:
“This is char.” 这个是C样式的字符串。它们不是对象。
@“This is char.”这个是面向对象的字符串对象。
while循环用到了空字符等于数值0这一事实,熟练的Objective-C编程人员经常这样使用。
~~~
char *from;
char *to;
while (*from)
*to++ = *from++;
*to = '\0';
~~~
函数指针:
1)常见应用之一是作为参数传递给其它函数。
2)常见应用之一是建立分派表。即函数列表。
上面这些C语言特性,要记住一个基本原则:它们都不是对象。
这意味着不能给它们传递消息,也不能利用它们获得Foundation框架提供的内存分配策略之类的最大优势。
其他语言特性:
符合字面量:
`(struct data) {.month = 7, .day = 2, .year = 2011}`
#### goto语句:
懒惰的程序员才会经常滥用goto语句,goto语句的执行导致在程序中产生一个到达特定点的直接分支。
如果你不懒惰,建议你还是不要经常使用该语句。
#### 空语句:
不做任何操作。
逗号运算符:
优先级列表里最底层的运算符,
在Objective-C语言中,所有的运算符都产生一个值,
所以逗号运算符的值是最右边的表达式值。
sizeof运算符:
Objective-C语言提供了sizeof运算符,
它可以用来确定数据类型或对象的大小,返回的是指定项的字节大小。
#### 工作原理:
关于Objective-C语言和C语言联系的4个事实。
1)实例变量存储在结构中。
定义一个类和它的实例变量时,这些实例变量实际上存储在一个结构中。
这说明了如何处理对象,对象实际上是结构,结构中的成员是实例变量。
所以继承的实例变量加上你在类中添加的变量就组成了一个结构。
使用alloc分配新对象时,系统预留了足够的空间来存储这些结构。
结构中继承的成员(从根对象中获得的)之一是名为isa的保护成员,它确定对象所属的类。
2)对象变量实际上是指针。
来创建新的实例时,是在为对象的新实例分配存储空间(即存放结构的空间),然后使用结构的指针,并将指针变量存储在其中。
3)方法是函数,而消息表达式是函数调用。
方法实际上是函数。调用方法时,是在调用与接收者类相关的函数。
传递给函数的参数接收者(self)和方法的参数。
Objective-C编译器通过类名称和方法名称的组合为每个函数产生一个唯一的名称。
4)id类型是通用指针类型。
返回id类型值的方法只是返回指向内存中某对象的指针。
在C语言中就是 void *。
看了这4个事实后,你就会发现,其实,这些事实只是透露出Objective-C的面向对象底层是如何实现的。
基本上所有的面向对象都是使用面向过程的一个扩展来实现的,C++也是这样的。
也就是说,对象这个东西的底层实现都是由过程完成的。
简而言之:
对象都是结构struct和指针的组合而已。
看到很多面向对象的语言编译时都是转换为C语言的结构和指针,使用C语言编译。
说明面向对象的底层实现都是差不多的。
所以,从技术实现上来讲,没有特别大的变革。
但是从概念或思想上来说,这是巨大的。
另外,那些像perl,python等等这些解释执行的语言,最后的实现也是C语言来完成的。
语言是工具,但同样蕴涵着一种哲理,或是一种思想的表达。
语法或细节什么的忘记了可以再查看,理解了思想,你才能说对这门语言有所了解。