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 }