从C到OCblocks语法的声明
在过去的一段时间,我开始从C的一些简单声明到更复杂的学习直到我开始学习了Objective-C中的blocks。我花了很长的一段时间去理解他并且认识到一旦你理解它是怎样组织的并且是怎样产生的,你就再也不用在你需要声明blocks的时候去谷歌上找了。
如果你想自己能够想都不用想的写出block,那就读下去!
我强烈建议不要去读过去的RSS阅读器或者以后的阅读器。它大量的有色地解释一些东西而且似乎都未出现.
声明
变量在C(在OC)中的声明
声明的两个规则:
1.说明变量的类型(编译器期望在内存当中找到)
2.在合适的范围内起变量名
让我们开始最简单的声明:
int a;
这看起来像你曾经写过的第一行C代码.
int是一个基本类型,a是一个变量名或者标识符。
为了阅读一个声明,你会从标识符开始,然后往右边一直读直到你不能然后开始往变量的左边。(我们会在下个部分来解释)
在我们变量的右边没有任何东西所以我们可以直接了当的说:a 是一个int
一个声明可以有一个基本类型并且在说明符的最左边。
说明符可以被基本类型在创建派生类的时候用修饰符修改。以下是4个修饰符(3个来自于ANSI-C还有一个来自于Apple’s proposed extensionANSI-CANSI-C),它们分别是
*,
, [],
, (),
and ^.
3种ANSI-C修饰符
指针修饰符*
int *a;
基本类型一直是int且变量名为a。但是指针的修饰符 * 告诉我们它是一个指向int类型的int类型的指针。
修饰符*总是在变量的左边。
数组修饰符[ ]
int a[ ];
这里我们看出数组修饰符[ ] 它是一个int类型的数组用于替代简单的int.这可以在数组的维数完成例如int[10]。
[ ]修饰符总是在修改变量的右侧。
方法修饰符( )
int f( );
方法修饰符( )是在告诉我们f是一个返回值为int类型的方法。这个修饰符也能指定参数举个例子int f(long)。是一个参数为一个长整型的且返回值为int类型的。
( )修饰符总是在修改变量的右侧。
组合修饰符
1.指针和数组
修饰符能被组合在一起去创造一个复合的变量类型。类似的如数学运算的优先级一样排列。
[ ]和( )的优先级高于*(和^)。自从两个高优先级的修饰符被写在变量的右侧之后,当我们读混合的声明时,总是从标识符和直接尽可能长时间然后离开当你到达说明符结束或关闭括号。
int *a[ ]
或者你能写上小括号以提高可靠性。
int *(a[ ])
但是你也许会问,如果我想要一个指向整型数组的指针该怎么办?最好是让*的优先级低于[ ]的优先级,用括号去破坏原有的优先级。
这里,a就是一个指向int类型的数组的指针了。
2.数组和方法
你不能有一个带方法的数组且方法不能返回一个数组或者方法。一个方法能将数组做为参数。
int f(int [10]);
这里f是一个用一个带有10个元素的整型数组作为参数且返回值是一个整型的方法。
3.指针和方法
int * f( );
int *( f( ) );
上述两种情况都是一个返回Int类型的指针的方法。
那如果你想要一个返回方法的指针该如何做?对,没错,答案是括号!
int (*f) ( );
这里f就是一个返回方法的int类型的指针。