【OC梳理】基本数据类型和基本运算

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 其余赋值运算符 左到右

你可能感兴趣的:(【OC梳理】基本数据类型和基本运算)