Objective-C作为以C语言为基础的语言,其基本数据类型与C语言类似。
1.基本数据类型
基本数据类型可以参考这篇文章OC:基本数据类型
文中介绍了int 、float 、double 、char 的信息。
OC中,常用还有NSInteger,CGFloat,NSString,以及布尔类型。
NSInteger
以下是NSInteger的定义代码:
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
#else
typedef int NSInteger;
#endif
从代码中,可以看到,在32位和64位系统中,NSInteger的定义为int和long。
在使用过程中,常常会在字符串中拼接某个NSInteger变量,此时如果用%d,那么在64位的编译环境下会有警告提示,如果改成%ld,那么在32位的环境下会有警告提示。
解决的办法是将NSInteger转换为long,使用%ld。
CGFloat
以下是CGFloat的定义代码:
#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
#else
# define CGFLOAT_TYPE float
#endif
typedef CGFLOAT_TYPE CGFloat;
从代码中,可以看到,在32位和64位系统中,CGFloat的定义为float和double。
布尔类型
OC中,布尔类型有四种bool、BOOL、Boolean、boolean_t。
表面上看好像都是布尔类型的数据,其实有一些区别:
bool
bool 的定义如下:
#define _Bool bool
_Bool类型是C99引入的新类型,用来表示布尔类型,C99没有规定_Bool具体占多少位,只要求至少可以表示0和1,并且还规定,任何非零的数赋给_Bool类型都会转化位1,表示真,0赋给_Bool类型表示假。
所以bool为0时其值为false;
任何非零的数赋给bool类型都会转化为1,即true。
BOOL
BOOL和bool稍有不同,以下是它的定义代码:
#if OBJC_BOOL_IS_BOOL
typedef bool BOOL;
#else
# define OBJC_BOOL_IS_CHAR 1
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
#endif
代码中,OBJC_BOOL_IS_BOOL值在iOS平台上为1。
可以发现,在iOS平台和OS X平台上,BOOL的定义分别是bool和signed char。
bool与signed char有什么区别呢?
bool由于定义的原因非0即1;
而signed char的取值范围为-128 ~ 127,因此如果将大于8位数的值赋予signed char,只会截取后8位,那么 后7位的值如果为0(1位符号位) ,signed char的值就为0,否则为1。如:将128(10000000)、256(100000000)、512(1000000000)等等赋予signed char,其值为0。
所以,在OS X平台中,如果运行以下代码:
BOOL i = 128;
if (i == YES) {
NSLog(@"YES");
}else
if (i == NO) {
NSLog(@"NO");
}else{
NSLog(@"Other");
}
其输出的结果为Other(只要是非0和1的情况 都是输出Other)。可以看到,如果在OS X平台中使用BOOL类型应避免与真值YES直接比较,避免得到错误的结果。
Boolean
Boolean的定义代码为:
typedef unsigned char Boolean;
其定义为unsigned char(取值范围0-255),有着与signed char的特点,因此同样应避免使用Boolean与真值YES直接比较。
boolean_t
boolean_t的定义代码为:
#if defined(__x86_64__) && !defined(KERNEL)
typedef unsigned int boolean_t;
#else
typedef int boolean_t;
#endif
可以看到是int/unsigned int类型,同样应避免使用Boolean与真值YES直接比较。
2.基本运算
位运算符
Objective-C支持的位运算符有6个:
& :按位与(同 1 才为 1,其余为 0,如 00011001&10011000 = 00011000)
| :按位或(同 0 才为 0,其余为 1,如 00011001 | 10011000 = 10011001)
~ :按位非(按位取反,如 ~00000001 = 11111110)
^ :按位异或(不同为1,相同为0,如 00011001 ^ 10011000 = 10000001)
<<:左位移运算符(转为二进制后左移,如11001 << 4 = 110010000,实际上相当于乘上2的4次方)
>>:右位移运算符(转为二进制后右移(去掉多余位),如110011111 >> 4 = 11001,实际上相当于除于2的4次方(取整))
算术运算符
Objective-C支持所有的基本算数运算符,+、-、*、/、++、--、%,用法和C语言一样。
+=:如 x += y,对应 x = x + y。还有其他九种以此类推。
-= 、 *= 、 /= 、 %= \ &= 、= 、 ^= 、 <<= 、 >>=。
比较运算符
大于:> 、大于等于:>=、小于:<、小于等于:<=、等于:==、不等于:!=
逻辑运算符
&&(与)、||(或)、!(非)、^(异或)
三目运算符
表达式1 ? 表达式2 : 表达式3
如果表达式1成立运行表达式2,否则运行表达式3.
运算符的优先级
优先级 | 运算符 | 结合方向 |
---|---|---|
1 | []、() | 左到右 |
2 | -(取负)、~(位非)、++、--、*(指针变量)、&(取地址)、强制类型转换、sizeof() | 右到左 |
3 | /、*、 % | 左到右 |
4 | +、- | 左到右 |
5 | <<、>> | 左到右 |
6 | >、>=、<、<= | 左到右 |
7 | ==、!= | 左到右 |
8 | &(位与) | 左到右 |
9 | ^(位异或) | 左到右 |
10 | I(位或) | 左到右 |
11 | &&(逻辑与) | 左到右 |
12 | II(逻辑或) | 左到右 |
13 | ?:(三目运算) | 左到右 |
14 | 其余赋值运算符 | 左到右 |