1 #import <Foundation/Foundation.h>
2
3 /** 1.define语句:预定义名称右边的所有字符都会被预处理程序替换到程序中 */
4 /**
5 * 使用注意:
6 * 1.预定义名称不是变量,不能给它赋值,除非替换指定值的结果实际上是一个变量;
7 * 2.语句末尾不能出现分号“;”;
8 * 3.预处理程序定义的右面不必是合法的Objective-C表达式,如 #define AND &&
9 * 4.预定义的值可以引用另一个预定义的值,如
10 #define PI 3.141592654
11 #define TWO_PI 2.0 * PI // 两个表达式前后颠倒也是合法的
12 [规则:在程序中使用预定义名称时,只要所有的符号都是定义过的,那么就可以在定义中引用其他预定义的值]
13 */
14
15 /** 命名规范:预定义的名称都用大写,如PI,或者在定义之前加k,但k之后的字符并不全部大写,如kMaxValues; */
16
17 /** 1.1 简单使用 */
18 #define PI 3.141592654
19 #define TWO_PI 2.0 * PI
20
21 /** 1.2 检测变量year是不是闰年 */
22 /**
23 #define IS_LEAP_YEAR year % 4 == 0 && year % 100 != 0 \
24 || year % 400 == 0 // if (IS_LEAP_YEAR)
25 // 上面的define实际上是这个意思: if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)……
26 */
27
28 /** 1.3 将IS_LEAP_YEAR定义为带有一个名为y的参数,来判断任何一年是否为闰年 */
29 #define IS_LEAP_YEAR(y) y % 4 == 0 && y % 100 != 0 \
30 || year % 400 == 0 // 这里没有定义参数y的类型,因为这里仅执行字面文本替换,并没有调用函数,注意:预定义名称和参数列表的左括号之间不允许空格
31 // if (IS_LEAP_YEAR(nextYear)) 用来判断nexYear的值是不是闰年
32 // 上面的define实际上是这个意思: if (nextYear % 4 == 0 && nextYear % 100 != 0 || nextYear % 400 == 0) ……
33
34 /** 1.4 带参数的宏定义的一个“小陷阱” */
35 #define SQUARE(x) x * x
36 // y = SQUARE(v) 等价于 y = v ^ 2;而y = SQUARE(v + 1) 等价于 y = v + 1 * v + 1,而不是等于 y = (v + 1) * (v + 1)。因为与处理程序对宏定义的参数是实行文本替换的,要想解决这个问题,需要加括号, #define SQUARE(x) ((x) * (x))
37
38 /** 1.5 练习:创建个分数 */
39 #define MakeFract(x,y) ([[Fraction alloc] initWith: x over: y])
40 // 创建分数1/3 myFract = MakeFract(1,3);
41
42 /** 1.6 注意:运算符的优先级的问题
43 * &运算符是按位AND运算符,它的优先级低于宏中使用的>运算符。如果宏定义中没有括号,>运算符将在按位AND之前求值。
44 * 题: #define IS_LOWER_CASE(x) ( ((x) >= 'a') && ((x) <= 'z') )
45 */
46
47
48 @interface Circle : NSObject
49 @PRoperty(nonatomic, assign) int radius; // 圆的半径
50 @property(nonatomic, assign) int year;
51 - (double)area;
52 - (double)circumference;
53 @end
54
55
56 @implementation Circle
57 - (double)area
58 {
59 return PI * _radius * _radius;
60 }
61 - (double)circumference
62 {
63 return 2.0 * PI * _radius;
64 return TWO_PI * _radius;
65 }
66 @end
67
68
69 int main(int argc, const char * argv[]) {
70 @autoreleasepool {
71 Circle *c = [[Circle alloc] init];
72 c.radius = 5;
73 NSLog(@"圆的面积是%f平方米,圆的周长是%f米", [c area], [c circumference]);
74 return 0;
75 }
76 }