关于ios:iOS开发基础C语言数据类型和运算符

8次阅读

共计 10963 个字符,预计需要花费 28 分钟才能阅读完成。

第 2 章 数据类型和运算符

2.1 正文

  1. 程序正文是源代码的一个重要局部,对于一份标准的程序源代码而言,正文应该占到源代码的 1 / 3 以上;
  2. 单行正文 //
  3. 多行正文 /*正文开始和 */ 正文完结,须要指出的是多行正文不能够嵌套,在 /**/ 多行正文代码块内,不能再次应用 /**/ 增加多行正文;

2.2 标识符和变量

2.2.1 分隔符

Objective- C 语言里的分号(;)、花括号({})、方括号([])、圆括号(())、空格、圆点(.)都具备非凡的分隔作用,因而被统称为分隔符。

  1. 分号
    Objective- C 语言里语句的分隔不是应用回车来实现的,而是采纳分号(;)作为语句的分隔,因而,每个 Objective-C 语句必须应用分号作为结尾。Objective-C 程序容许一行书写多行语句,每个语句之间以分号隔开即可,单从程序的可读性角度来看,应该防止在一行书写多个语句;一个语句也能够跨多行,只有在最初完结的中央应用分号完结即可。
  2. 花括号
    花括号的作用就是定义一个代码块,一个代码块指的就是 ” {” 和 ”}” 所蕴含的一段代码,代码块在逻辑上是一个整体。
  3. 方括号
  4. 圆括号
  5. 空格
    Objective-C 语言中的空格蕴含空格符(Space)、制表符(Tab) 和回车(Enter) 等。除此之外,Objective-C 源程序还会应用空格来正当缩进代码,从而提供更好的可读性。
  6. 圆点

2.2.2 标识符规定

标识符,就是用于给程序中变量、类、办法命名的符号。规定如下:

  1. 标识符能够由字母、数字、下画线(_)和美元符($)组成,其中不能以数字结尾;
  2. 标识符不能是 Objective-C 关键字,但能够蕴含关键字;
  3. 标识符不能蕴含空格;
  4. 标识符只能蕴含美元符($),不能蕴含@、#等其余特殊字符;
  5. Objective- C 语言是辨别大小写的。因而,abc 和 Abe 是两个不同的标识符;

2.2.3 Objective-C 关键字

  1. auto
  2. break
  3. case
  4. char
  5. const
  6. continue
  7. default
  8. do
  9. double
  10. else
  11. enum
  12. extern
  13. float
  14. for
  15. goto
  16. if
  17. int
  18. long
  19. register
  20. return
  21. short
  22. signed
  23. sizeof
  24. static
  25. struct
  26. switch
  27. typedef
  28. union
  29. unsigned
  30. void
  31. volatile
  32. while

2.3 数据类型分类

Objective- C 语言其实就是 C 语言的超集,因而,它支待的数据类型与 C 根本类似,大抵分类如下:
数据类型:

  1. 根本类型

    1. 整型
    2. 字符型
    3. 浮点型

      1. float 类型
      2. double 类型
    4. 枚举型
  2. 构造类型

    1. 数组类型
    2. 构造体类型
    3. 共用体类型
  3. 指针类型

    1. 指针类型既是 C 语言最重要的数据类型,也是 Objective-C 最重要的类型,所有的零碎类、自定义类的实质都是指针类型。
    2. 还有一种非凡的空类型(null type), 空类型就是 nil 值的类型,这种类型没有名称。因为空类型没有名称,所以不可能申明一个空类型的变量,或将变量转换成空类型。空援用(nil) 是空类型变量惟一的值。空援用 nil 能够转换为任何援用类型。

2.4 根本数据类型

2.4.1 整型

  1. short int(简称 short):在内存中通常占 16 位,取值范畴:-2^15 ~ 2^15 – 1;
  2. int:在内存中通常占 32 位,取值范畴:-2^31 ~ 2^31 – 1;
  3. long int(简称 long):在内存中通常占 64 位,取值范畴:-2^63 ~ 2^63 – 1;
  4. long long:在内存中通常占 64 位,取值范畴:-2^63 ~ 2^63 – 1;

须要指出的是,Objective-C 并没有硬性规定各种整型在内存中所占的空间。通常来说,Objective-C 要求 long long 型所占用的内存空不小于 long 型所占用的内存空间,long 型所占的内存空间应该不小千 int 所占的内存空间,int 型所占的内存空间应该不小于 short 型所占用的内存空间。

教训证,在 64 位 Mac 零碎上,iPhone 8 Plus,short 占 2 字节,int 占 4 字节,long 占 8 字节,long long 占 8 字节。

size_t stSize = sizeof(short);
size_t intSize = sizeof(int);
size_t ltSize = sizeof(long);
size_t llSize = sizeof(long long);
NSLog(@"\nshortSize = %zu\nintSize = %zu\nlongSize = %zu\nlonglongSize = %zu",stSize,intSize,ltSize,llSize);
打印:shortSize = 2
intSize = 4
longSize = 8
longlongSize = 8

Objective-C 中整数常量有 3 种示意形式:十进制、八进制和十六进制,其中八进制的整
数常量以 0 结尾,十六进制的整数以 0x 或者 0X 结尾,其中 10~15 别离以 a~f (此处的 a~f 不辨别大小写)来示意。

// 以 0 结尾的整数常量是八进制的整数
int octalValue = 013;
// 以 0x 或者 0X 结尾的整数常量是十六进制的整数
int hexValue = 0x13;
NSLog(@"\noctalValue = %d\nhexValue = %d",octalValue,hexValue);
打印:octalValue = 11
hexValue = 19

Objective-C 还容许在上述 4 种整型后面增加 unsigned 关键词,将它们变成无符号整型,无符号整型的最高位不是符号位,而是数值位,因而无符号整数不能示意正数。但与此同时,无符号整型的最大值比对应的一般整型的最大值大一倍。比方,short int 的取值范畴是 -2^15 ~ 2^15 – 1, 而 unsigned short 的取值范畴则是 0~2^16 – 1。

2.4.2 NSLog 输入函数及格局字符

应用 NSLog()函数非常简单,它的第一个参数应该是一个字符串常量,该字符串中可应用%格局的占位符,这个占位符将会由对应的变量填充。
% 格局的占位符如下:

  1. %d:以带符号的十进制模式输入整数(负数不输入符号);
  2. %o:以八进制无符号模式输入整数(不输入 0 前缀);
  3. %x:以十六进制无符号模式输入整数(不输入 0x 前缀);
  4. %u:以无符号十进制模式输入整数;
  5. %c:以字符模式输入,只输入一个字符;
  6. %s:输入 C 格调的字符串;
  7. %f:以小数模式输入浮点数,默认输入 6 位小数;
  8. %e:以指数模式输入浮点数,数字局部默认输入 6 位小数;
  9. %g:主动选用 %f 或 %e 其中之一,保障输入宽度较短的格局,并且不会输入无意义的 0;
  10. %p:以十六进制模式输入指针变量所代表的地址值;
  11. %@:输入 Objective-C 的对象;
  12. %zu:C99,输入 size_t 类型

    /*  32 位 */
    typedef unsigned int    size_t;
    typedef int             ssite_t;
     
    /*  64 位 */
    typedef unsigned long   size_t;
    typedef long            ssize_t;

在%与格局字符之间,还可插入如下附加符:

  1. l (字母):可在格局字符 d、o、x、u 之前,用于输入长整型整数,比方 %ld;也可在 f、e、g 之前,用于输入长浮点型数;
  2. m (代表一个正整数):指定输入数据所占的最小宽度;
  3. .n:对于浮点数,示意输入 n 位小数;对于字符串,示意截取的字符个数;
  4. -:示意输入的数值向右边对齐;
int a = 56;
NSLog(@"==%d==" , a);
NSLog(@"==%9d==" , a); // 输入整数占 9 位
NSLog(@"==%09d==" , a); // 输入整数占 9 位,前边空位用 0 代替
NSLog(@"==%-9d==" , a); // 输入整数占 9 位,并且左对齐
NSLog(@"=%o==", a); // 输入八进制数
NSLog(@"==%x==", a); // 输入十六进制数
long b = 56;
NSLog(@"%ld" , b); // 输入 long int 型的整数
double dl = 2.3;
NSLog(@"==%f==" , dl); // 以小数模式输入浮点数
NSLog(@"==%e==" , dl); // 以指数模式输入浮点数
NSLog(@"==%g==" , dl); // 以最简模式输入浮点数
NSLog(@"==%9f==" , dl); // 以小数模式输入浮点数,并且起码占用 9 位
NSLog(@"==%9.4f==" , dl); // 以小数模式输入浮点数,至多占用 9 位,小数点共 4 位
NSLog(@"==%9lf==" , dl); // 以小数模式输入长浮点数,并且起码占用 9 位
NSLog(@"==%9.4lf==", dl); // 以小数模式输入长浮点数,至多占用 9 位,小数点共 4 位
打印:2019-02-17 16:02:37.414651+0800 StudyDemoProjectDemo[478:51240] ==56==
2019-02-17 16:02:47.162964+0800 StudyDemoProjectDemo[478:51240] ==       56==
2019-02-17 16:02:47.162964+0800 StudyDemoProjectDemo[478:51240] ==000000056==
2019-02-17 16:02:50.546915+0800 StudyDemoProjectDemo[478:51240] ==56       ==
2019-02-17 16:02:53.770814+0800 StudyDemoProjectDemo[478:51240] =70==
2019-02-17 16:02:54.635277+0800 StudyDemoProjectDemo[478:51240] ==38==
2019-02-17 16:02:57.499029+0800 StudyDemoProjectDemo[478:51240] 56
2019-02-17 16:03:00.236972+0800 StudyDemoProjectDemo[478:51240] ==2.300000==
2019-02-17 16:03:02.469281+0800 StudyDemoProjectDemo[478:51240] ==2.300000e+00==
2019-02-17 16:03:03.746471+0800 StudyDemoProjectDemo[478:51240] ==2.3==
2019-02-17 16:03:06.426914+0800 StudyDemoProjectDemo[478:51240] == 2.300000==
2019-02-17 16:03:29.924144+0800 StudyDemoProjectDemo[478:51240] ==   2.3000==
2019-02-17 16:03:38.167223+0800 StudyDemoProjectDemo[478:51240] == 2.300000==
2019-02-17 16:03:42.453096+0800 StudyDemoProjectDemo[478:51240] ==   2.3000==

2.4.3 字符型

字符型通常用于示意单个的字符,字符常量必须应用单引号(')引起来。Objective-C 的每个字符只占一字节,因而,单个的 Objective-C 字符变量并不支待中文字符,中文字符占 2 个字节。

  1. 间接通过单个字符来指定字符常量:例如 ’A’、’9’ 和 ’O’ 等;
  2. 通过转义字符示意特殊字符常量:例如 ’\n’、’\t’ 等;

转义字符如下:

  1. \b:退格符;
  2. \n:换行符;
  3. \r:回车符 enter;
  4. \t:制表符 tab;
  5. \":双引号;
  6. \';单引号;
  7. \\;反斜线;

不仅如此,char 类型的值也可间接作为整数型的值来应用,但它是一个 8 位的无符号整数,即全副是负数,取值范畴是 0 -255。如果把一个在 0~255 范畴内的 int 整数赋给 char 类型的变量,零碎会主动把这个 int 整数当成 char 类型来解决。

2.4.4 浮点型

浮点类型有 3 种:float、double 和 long double, 一般来说,float 型占用 4 字节,double 型变量占 8 字节;而 long double 则占 16 字节(iPhone 8plus 测试是 8 字节);
Objective-C 的浮点数有两种示意模式

  1. 十进制数模式:这种模式就是平时简略的浮点数,例如,5.12, 512.0, .512。浮点数必须蕴含一个小数点,否则会被当成 int 类型解决;
  2. 迷信计数法模式:例如,5.12e2 (即 5.12 10^2)、5.12E2 (也是 5.12 10^2);

必须指出的是,只有浮点类型的数值才能够应用迷信计数模式示意。例如,51200 是一个 int 类型的值,但 512E2 则是浮点型的值。

除此之外,Objective-C 还提供了 3 个非凡的浮点型数值:正无穷大、负无穷大和非数,例如,应用一个负数除以 0.0 将失去正无穷大,应用一个正数除以 0.0 将失去负无穷大,0.0 除以 0.0 或对一个正数开方将失去一个非数。必须指出的是,所有的正无穷大数值都相等,所有的负无穷大数值都相等;而非数不与任何数值相等,甚至和非数本人都不相等。

double d = 512000.f;
double num1 = d/0.0f;
double num2 = -d/0.0f;
double num3 = 0.0f/0.0f;
NSLog(@"正无穷大 inf=%g",num1);
NSLog(@"负无穷大 -inf=%g",num2);
NSLog(@"非数 nan=%g",num3);
NSLog(@"正无穷大比拟 %d",num1==1/0.0f);
NSLog(@"负无穷大比拟 %d",num2==-1/0.0f);
NSLog(@"非数比拟 %d",num3==num3);
打印:2019-02-17 18:06:51.406790+0800 StudyDemoProjectDemo[563:72926] 正无穷大 inf=inf
2019-02-17 18:06:51.407105+0800 StudyDemoProjectDemo[563:72926] 负无穷大 -inf=-inf
2019-02-17 18:06:51.407216+0800 StudyDemoProjectDemo[563:72926] 非数 nan=nan
2019-02-17 18:06:51.407306+0800 StudyDemoProjectDemo[563:72926] 正无穷大比拟 1
2019-02-17 18:06:51.407387+0800 StudyDemoProjectDemo[563:72926] 负无穷大比拟 1
2019-02-17 18:06:51.407468+0800 StudyDemoProjectDemo[563:72926] 非数比拟 0 

2.4.5 枚举型

  1. 枚举类型定义

    enum season {
        spring = 4,
        summer,
        fall,
        winter
    };
    // 应用枚举值
    enum season mySeason;
    mySeason = summer;
    // 把枚举值当成无符号整数执行输入
    NSLog(@"mySeason 的值:%u" , mySeason);
  2. 定义匿名枚举类型时间接定义变量

    enum {male, female} me, you;

    下面代码中定义了一个匿名枚举类型,并在定义该枚举类型时定义了两个变量:me 和 you, 这两个变量都只能等于 male 或 female 其中之一。

对于枚举值的几点阐明:

  1. 定义枚举时{}中列出来的枚举值,也称为枚举常量或枚举元素,这些枚举值不是变量,因而不能对它们赋值。实际上,每个枚举常量按它们的定义程序,顺次为 0、l、2、3, 以此类推。当然也可显式指定枚举常量的值;
  2. 枚举常量的实质就是无符号整数,因而,枚举值能够用来比拟大小。比拟大小的规定就是它们理论的整数值;
  3. 枚举值的实质是无符号整数,因而,Objective-C 容许间接将整数值赋值给枚举变量,甚至能够间接把枚举变量当成整数应用,比方,用它们来参加四则混合运算;

须要指出的是,尽管能够用整数值来代替枚举值,但理论编程中尽量不要应用整数值来代替枚举值,也不要应用枚举值来代替整数值-毕竟枚举值具备更好的可读性。

2.4.6 BOOL 类型

Objective-C 提供了一个 BOOL 类型,BOOL 类型的值有 YES 和 NO 两个值,别离代表真和假。但须要指出的是,Objective-C 底层实际上应用 signed char 来代表 BOOL。而 YES、NO 两个值的底层其实就是 1 和 0。对于 C 语言而言,所有的非零数都会被当成真,因而,YES 也会被当成真解决;而 NO 的值是 0, 因而,NO 也会被当成假解决。

2.5 类型转换

有两种类型转换形式:主动类型转换和强制类型转换。

2.5.1 主动类型转换

如果零碎支待把某个根本类型的值间接赋给另一个根本类型的变量,则这种形式被称为主动类型转换。主动转换规则如下:

  1. 把整型类型(包含字符型)的变量和值赋值给浮点型变量,不会有太大的变动;
  2. 把浮点型类型的变量和值赋值给整型(包含字符型)变量,数值的小数局部会被间接舍弃;
  3. 当把取值范畴大的变量值赋给取值范畴小的变量时,可能产生溢出;

    比方将 int 型变量 33000 赋值给 short 型变量时,short 的取值范畴是(-32768~32767),就会产生溢出,强制类型转换为 16 位的 short 类型,则须要截断后面 16 位,只保留后 16 位,余下 16 位中最右边的是符号位。

当把取值范畴大的变量或值转换为取值范畴小的类型时,必须分外小心,因为非常容易引起信息失落。

2.5.2 强制类型转换

强制类型转换的运算符是圆括号()。

// 将浮点型强制转换成 int 型进行计算
int a = (int)2.3 + (int)122.2;

2.5.3 表达式类型的主动晋升

当一个算术表达式中蕴含多个根本类型的值时,整个算术表达式的数据类型将产生主动晋升:

  1. 所有的 short 型、char 型将被晋升到 int 型;
  2. 整个算术表达式的数据类型主动晋升到与表达式中最高等级操作数同样的类型;
  3. 操作数的等级排列为 short<int<long<long long<float<double<long double;

2.6 运算符

Objective-C 语言中的运算符可分为如下几种:

  1. 算术运算符
  2. 赋值运算符
  3. 比拟运算符
  4. 逻辑运算符
  5. 位运算符
  6. 类型相干运算符

2.6.1 算术运算符

  1. +:加法运算符,+还能够作为字符串的连贯运算符;
  2. -:减法运算符,还能够作为求负的运算符号;
  3. *:乘法运算符;
  4. /:除法运算法;
    除法运算符有些非凡,如果除法运算符的两个运算数都是整数类型,则计算结果也是整数,就是将天然除法的后果截断取整,例如,19/4 的后果是 4, 而不是 5。
  5. %:求余运算符;
    它要求运算符两边的操作数都必须是整数,它的计算结果是应用第一个运算数来除以第二个运算数(不能够为 0),失去一个整除的后果后,剩下的值就是余数。
  6. ++:自加;
    这是一个单目运算符,运算符既能够呈现在操作数的右边,也能够呈现在操作数的左边,但呈现在右边和左边的成果是不一样的。如果把 ++ 放在右边,则先把操作数加 1, 而后才把操作数放入表达式中参加运算,如果把 ++ 放在左边,则先把操作数放入表达式中参加运算,而后才把操作数加 1, 看如下代码:

    int e = 1;
    int f = e++ + 6;
    NSLog(@"e = %d, f = %d",e,f);
    e = 1;
    f = ++e + 6;
    NSLog(@"e = %d, f = %d",e,f);
    打印:2019-02-17 19:09:44.544752+0800 StudyDemoProjectDemo[607:80323] e = 2, f = 7
    2019-02-17 19:09:51.456103+0800 StudyDemoProjectDemo[607:80323] e = 2, f = 8
  7. –:自减;
    也是一个单目运算符,成果与 ++ 根本类似,只是将操作数的值减 1。

2.6.2 赋值运算符

Objective-C 应用 ” = ” 作为赋值运算符。值得指出的是,赋值表达式是有值的,赋值表达式的值就是左边被赋的值。例如,NSString *str2 = str 表达式的值就是 str。因而,赋值运算符反对间断赋值,通过应用多个赋值运算,能够一次为多个变量赋值:

int a;
int b;
a = b = 7;

Objective-C 尽管反对一次为多个变量赋值的写法,但这种写法会导致程序的可读性升高,因而不举荐这样写。

2.6.3 位运算符

Objective-C 反对的位运算符有如下:

  1. &:按位与;
  2. |:按位或;
  3. ~:按位非;
  4. ^:按位异或;
  5. <<:左位移运算符;
  6. >>:右位移运算符;
第 1 运算数 第 2 个运算数 按位与 按位或 按位异或
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

** 提醒:
所有的数字在计算机底层都是以二进制模式存在的,原码是间接将一个数值转换成二进制数。但计算机以补码的模式保留所有的整数。补码的计算规定如下:负数的补码和原码完全相同,正数的补码是其反码 +1;反码是对原码按位取反,只是最高位(符号位)放弃不变。正数补码求原码:补码符号位不变,补码 -1,再取反就是原码。**

例子:

  1. 非运算

    short a1 = -5;
    NSLog(@"~a1=%d",~a1);
    打印:~a1=4
    原理解析:- 5 的原码:10000000 00000101
    - 5 的反码:11111111 11111010
    - 5 的补码:11111111 11111011
    - 5 非运算:00000000 00000100(符号位 0 是负数,数值 =4)
  2. 异或运算

    short b1 = 5;
    short c1 = 9;
    NSLog(@"b1^c1=%d",b1^c1);
    打印:b1^c1=12
    原理剖析:5 的补码:00000000 00000101
    9 的补码:00000000 00001001
    异或运算:00000000 00001100(12)
    

位移运算符:

左移运算符是将运算数的二进制码整体左移指定位数,左移后左边空进去的位以 0 来填充;
右移运算符为:>>,对于>>运算符而言,把第一个操作数的二进制码右移指定位数后,右边空进去的位以原来的符号位来填充。即如果第一个操作数原来是负数,则右边补 0; 如果第一个操作数原来是正数,则右边补 1。

例子:

  1. 位移运算
NSLog(@"5<<2=%d",5<<2);
NSLog(@"-5<<2=%d",-5<<2);
NSLog(@"5>>2=%d",5>>2);
NSLog(@"-5>>2=%d",-5>>2);
打印:5<<2=20
-5<<2=-20
5>>2=1
-5>>2=-2
原理剖析:(以 short 类型为例)
5 的原码:00000000 00000101
5 的补码:00000000 00000101
5<<2:00000000 00010100(20)
5>>2:00000000 00000001(1)
- 5 的原码:10000000 00000101
- 5 的反码:11111111 11111010
- 5 的补码:11111111 11111011
-5<<2 补码:11111111 11101100
-5<<2 反码:11111111 11101011
-5<<2 原码:10000000 00010100(-20)
-5>>2 补码:11111111 11111110
-5>>2 反码:11111111 11111101
-5>>2 原码:10000000 00000010(-2)

** 非凡:
1<<0(1)
1<<1(2)
1<<2(4)
1<<3(8)**

** 总结:
当进行位移运算时,不难发现,左移 n 位就相当于乘以 2 的 n 次方,右移则是除以 2 的 n 次方(如果不能整除,理论返回的后果为小于除法后果的最大整数)不仅如此,进行位移运算不会扭转操作数自身,它只是失去了一个新的运算后果,而原来的操作数自身是不会扭转的。**

2.6.4 扩大后的赋值运算符

赋值运算符可与算术运算符、位移运算符联合,扩大成为性能更加弱小的运算符。

  1. +=;x += y,对应 x = x + y;
  2. -=
  3. *=
  4. /=
  5. %=
  6. |=
  7. &=
  8. ^=
  9. <<=
  10. >>=;x>>=y,对应 x = x>>y;

2.6.5 比拟运算符

比拟运算符用于判断两个变量或常量的大小,比拟运算的后果是整数值(1 代表真、0 代表假)

  1. >
  2. >=
  3. <;
  4. <=;
  5. ==;
    如果进行比拟的两个操作数都是数值型,即便它们的数据类型不雷同,只有它们的值相等,都将返回 1。例如,97==‘a’ 返回 1;5.0 = 5 也返回 1。
  6. !=;
    如果进行比拟的两个操作数都是数值型,无论它们的数据类型是否雷同,只有它们的值不相等,都将返回 1。

2.6.6 逻辑运算符

逻辑运算符用于操作两个布尔型的变量或常量。

  1. &&(与);必须前后两个操作数都是真才返回真,否则返回假。
  2. ||(或);只有两个操作数中有一个真,就能够返回真,否则返回假。
  3. !(非);

    只须要一个操作数,如果操作数为真,返回假;如果操作数为假,返回真。须要指出的是,Objective-C 并没有提供示意真、假的布尔型数据,Objective-C 通常会用 1 代表真,用 0 代表假。除此之外,Objective-C 会把任意非 0 的数值当成真,0 才会被当成假。!5 的值为 0。

  4. ^(异或);当两个操作数不同时才返回真,如果两个操作数雷同,则返回假。

2.6.7 逗号运算符

Objective-C 提供了逗号运算符,用于将多个表达式”连贯”起来,而整个逗号表达式将返回最初一个表达式的值。语法格局如下:
表达式 1, 表达式 2, 表达式 3, ... , 表达式 n
当咱们须要将逗号表达式的值赋给指定变量时,千万不要忘了把整个逗号表达式用圆括号括起来。

int a = (3 * 4, 5 > 2)
a 的值为 1 

须要指出的是,并不是所有呈现逗号的中央都是逗号表达式,比方后面程序中罕用的输入语句:NSLog(@”%d, %d” , a, b);, 这条输入语句中的逗号只是用于分隔向 NSLog()函数传入的多个参数,并不是逗号表达式。

2.6.8 三目运算符

三目运算符(?:)语法格局:
(expression) ? if-true-statement : if-false-statement;
三目运算符的规定是:先对逻辑表达式 expression 求值,如果逻辑表达式返回真,则执行并返回第二个操作数的值,如果逻辑表达式返回假,则执行并返回第三个操作数的值。

2.6.9 运算符的联合性和优先级

Objective-C 语言中的大部分运算符也是从左向右联合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左联合的,也就是它们是从右向左运算的。

运算符的优先级:

  1. 分隔符:. () [] {} ->
  2. 单目运算符:++ -- ~ ! *(取变量运算符) &(取地址运算符) sizeof
  3. 强制类型转换运算符:(type)
  4. 乘法 / 除法 / 求余:* / %
  5. 加法 / 减法:+ -
  6. 移位运算符:<< >>
  7. 关系运算符:< <= > >=
  8. 等价运算符:== !=
  9. 按位与:&
  10. 按位异或:^
  11. 按位或:|
  12. 条件与:&&
  13. 条件或:||
  14. 三目运算符:?:
  15. 赋值:= += -= *= /= &= |= ^= %= <<= >>=
  16. 逗号运算符:,

尽管 Objective-C 运算符存在这种优先级的关系,但并不举荐适度依赖这种运算符的优先级,否则会升高程序的可读性。因而留神以下两点。

  1. 不要把一个表达式写得过于简单,如果一个表达式过于简单,应把它分成几步来实现。
  2. 不要过多地依赖运算符的优先级来管制表达式的执行程序,这会升高程序的可读性,应尽量应用()来管制表达式的执行程序。
正文完
 0