第三章.运算符

在Swift中你可以对浮点数进行取余运算( % )

术语

运算符有一目, 双目和三目运算符.

一目运算符对操作一个对象, 如 -a.

  一目运算符分为前置运算符和后置运算符, 前置运算符需紧排操作对象之前, 如 !b, 后置运算符需紧跟操作对象之后,如 i++,

双目运算符操作两个操作对象, 如 2 + 3. 是中置的, 因为它们出现在两个操作对象之间.

三目运算符操作三个操作对象, 和C语言一样, Swift只有一个三目运算符, 就是三目条件运算符 a ? b : c.

受运算符影响的值叫操作数, 在表达式 1 + 2 中, 加号 + 是双目运算符, 它的两个操作数是值 1 和 2.

赋值运算符

赋值运算 a = b, 表示用 b 的值来初始化或更新 a 的值.

1 let b = 10
2 var a = 5
3 a = b
4 // a 现在等于 10

如果赋值的右边是一个多元组, 它的元素可以马上被分解多个变量或变量

1 let (x, y) = (1, 2)
2 // 现在 x 等于 1, y 等于 2

与C语言和Objective-C不同, Swift的赋值操作并不返回任何值. 所以以下代码是错误的:

1 if x = y {
2     // 此句错误, 因为 x = y 并不返回任何值
3 } 

数值运算

Swift让所有数值类型都支持了基本的四则运算:

加法 +

减法 -

乘法 *

除法 /

1 1 + 2       // 等于 3
2 5 - 3       // 等于 2
3 2 * 3       // 等于 6
4 10.0 / 2.5  // 等于 4.0 

加法操作 + 也用于字符串的拼接:

1 "hello, " + "world"  // 等于 "hello, world" 

求余运算

1 9 % 4    // 等于 1
2 -9 % 4   // 等于 -1 

注意:在对负数求余时, 负数的符号会被忽略. 这意味着 a % b 和 a % -b的结果是相同的.

浮点数求余计算
1 8 % 2.5 // 等于 0.5 

这个例子中, 8除于2.5等于3余0.5, 所以结果是0.5.

自增和自减运算

1 var i = 0
2 ++i      // 现在 i = 1 

每调用一次 ++i, i 的值就会加1.实际上

  • ++i 等于 i = i + 1
  • - - i 等于 i = i  - 1

++ 和 --既是前置又是后置运算. ++i, i++, --i 和 i-- 都是有效的写法.

它们的区别是:

  • 当 ++ 前置的时候, 先自増再返回.
  • 当 ++ 后置的时候, 先返回再自增.
1 var a = 0
2 let b = ++a // a 和 b 现在都是 1
3 let c = a++ // a 现在 2, 但 c 是 a 自增前的值 1 

上述例子, let b = ++a, 先把 a 加1了再返回 a 的值. 所以 a 和 b 都是新值 1.

而 let c = a++, 是先返回了 a 的值, 然后 a 才加1. 所以 c 得到了 a 的旧值1, 而 a 加1后变成2.

推荐你使用 ++i 和 --i, 因为先修改后返回这样的行为更符合我们的逻辑.

单目负号

数值的正负号可以使用前缀 - (即单目负号) 来切换:

1 let three = 3
2 let minusThree = -three       // minusThree 等于 -3
3 let plusThree = -minusThree   // plusThree 等于 3, 或 "负负3" 

注意:单目负号写在操作数之前, 中间没有空格.

单目正号

单目正号 + 不做任何改变地返回操作数的值.

1 let minusSix = -6
2 let alsoMinusSix = +minusSix  // alsoMinusSix 等于 -6 

虽然单目 + 做无用功, 但当你在使用单目负号来表达负数时, 你可以使用单目正号来表达正数, 如此你的代码会具有对称美.

赋值运算符

Swift也提供把其他运算符和赋值运算 = 组合的复合赋值运算符, 加赋运算 += 是其中一个例子:

var a = 1
a += 2 // a 现在是 3 

表达式 a += 2 是 a = a + 2 的简写, 一个加赋运算就把加法和赋值两件事完成了.

注意:复合赋值运算没有返回值, let b = a += 2 这类代码是错误. 这不同于上面提到的自增和自减运算符.

比较运算

  1. 等于      a == b
  2. 不等于 a != b
  3. 大于      a > b
  4. 小于      a < b
  5. 大于等于 a >= b
  6. 小于等于 a <= b

每个比较运算都返回了一个标识表达式是否成立的布尔值:

1 == 1   // true, 因为 1 等于 1
2 != 1   // true, 因为 2 不等于 1
2 > 1    // true, 因为 2 大于 1
1 < 2    // true, 因为 1 小于2
1 >= 1   // true, 因为 1 大于等于 1
2 <= 1   // false, 因为 2 并不小于等于 1 

比较运算多用于条件语句, 如 if 条件:

let name = "world"
if name == "world" {
    println("hello, world")
} else {
    println("对不起, \(name), 我不认识你!")
}
// 输出 "hello, world", 因为 `name` 就是等于 "world" 

注意: Swift也提供恒等 === 和不恒等 !== 这两个比较符来判断两个对象是否引用同一个对象实例. 更多细节在 类与结构.

三目条件运算

三目条件运算的特殊在于它是有三个操作数的运算符,它的原型是 问题 ? 答案1 : 答案2.它简洁地表达根据 问题 成立与否作出二选一的操作.

如果 问题 成立, 返回 答案1 的结果;

如果不成立, 返回 答案2 的结果.

这里有个计算表格行高的例子. 如果有表头, 那行高应比内容高度要高出50像素; 如果没有表头, 只需高出20像素.

1 let contentHeight = 40
2 let hasHeader = true
3 var rowHeight = contentHeight
4 if hasHeader {
5     rowHeight = rowHeight + 50
6 } else {
7     rowHeight = rowHeight + 20
8 }
9 // rowHeight 现在是 90 

使用三目运算符简化后:

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight 现在是 90 

第二段代码例子使用了三目条件运算, 所以一行代码就能让我们得到正确答案. 这比第一段代码简洁得多, 无需将 rowHeight 定义成变量, 因为它的值无需在 if 语句中改变.

区间运算符

Swift提供了两个方便表达一个区间的值的运算符.闭区间和半闭区间

闭区间运算符

闭区间运算符 a...b 定义一个包含从 a 到 b (包括 a 和 b)的所有值的区间. ‌ 闭区间运算符在迭代一个区间的所有值时是非常有用的, 如在 for-in 循环中:

for index in 1...5 {
  println("\(index) * 5 = \(index * 5)")
}
// 1 * 5 = 5
// 2 * 5 = 10
// 3 * 5 = 15
// 4 * 5 = 20
// 5 * 5 = 25 

半闭区间

半闭区间的实用性在于当你使用一个0始的列表(如数组)时, 非常方便地从0数到列表的长度.

let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
    println("第 \(i + 1) 个人叫 \(names[i])")
}
// 第 1 个人叫 Anna
// 第 2 个人叫 Alex
// 第 3 个人叫 Brian
// 第 4 个人叫 Jack 

注意: 数组有4个元素, 但 0..count 只数到 3 (最后一个元素的下标), 因为它是半闭区间

逻辑运算

逻辑运算的操作对象是逻辑布尔值. Swift支持基于C语言的三个标准逻辑运算 

  逻辑非 !a

  逻辑与 a && b

  逻辑或 a || b

逻辑非

逻辑非运算 !a 对一个布尔值取反, 使得 true 变 false, false 变 true.

它是一个前置运算符, 需出现在操作数之前, 且不加空格. 读作 非 a,如下:

let allowedEntry = false
if !allowedEntry {
    println("ACCESS DENIED")
}
// prints "ACCESS DENIED" 

逻辑与

逻辑与 a && b 表达了只有 a 和 b 的值都为 true 时, 整个表达式的值才会是 true .

只要任意一个值为 false, 整个表达式的值就为 false. 事实上, 如果第一个值为 false, 那么是不去计算第二个值的, 因为它已经不可能影响整个表达式的结果了. 这被称做 "短路计算".

只有两个值都为true的时候才允许进入:

let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// 输出 "ACCESS DENIED

逻辑或

逻辑或 a || b 是一个由两个连续的 | 组成的中置运算符. 它表示了两个逻辑表达式的其中一个为 true, 整个表达式就为 true.

同逻辑与运算类似, 逻辑或也是"短路计算"的, 当左端的表达式为 true 时, 将不计算右边的表达式了, 因为它不可能改变整个表达式的值了.

let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// 输出 "Welcome!" 

组合逻辑

我们可以组合多个逻辑运算来表达一个复合逻辑:

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// 输出 "Welcome!"

使用括号来明确优先级

为了一个复杂表达式更容易读懂, 在合适的地方使用括号来明确优先级是很有效的, 虽然它并非必要的. 在上个关于门的权限的例子中, 我们给第一个部分加个括号, 使用它看起来逻辑更明确.

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// prints "Welcome!"

这括号使得前两个值被看成整个逻辑表达中独立的一个部分. 虽然有括号和没括号的输出结果是一样的, 但对于读代码的人来说有括号的代码更清晰.可读性比简洁性更重要

原文:http://www.cocoachina.com/ios/20140611/8767.html

2015-03-18

21:46:23

时间: 2025-01-14 03:11:48

第三章.运算符的相关文章

Java 第三章 运算符和条件结构 笔记

一.保存真或假,使用boolean变量      有两个值:true 真                  false 假 二.从控制台接受输入信息,通过创建扫描器     Scanner input new Scanner(System.in);     int age input.nextInt();//接收int类型     String name=input.next();//接收Strin类型 三.关系运算符     > < >= <= == != 四.==和=的区别  

第三章 运算符和表达式

课时20 认识运算符 1.运算符(操作符) 定义:是一个用于运算的符号,作用于一个或多个操作数. 操作数:参与运算的数据 2.运算符分类(A,B两类) A.按操作数的数量 一元(目)运算符 → 作用于一个操作数 二元(目)运算符 → 作用于两个操作数 (理解:一个运算符,例如:1+1=2   ''+'表示运算符,1和1是操作数) 三元(目)运算符 → 作用于三个操作数 代码表示的意思: double类型转化为int类型再转换为string类型 Double a=1.2; String b =(i

第三章 运算符和表达式;第四章 流程控制

javaSE习题 第三章 运算符、表达式和语句

问答: 1.下列System.out.printf的结果是什么? int a=100,x,y; x=++a; y=a--; System.out.printf("%d,%d,%d",x,y,a); 101,101,100 2.下列哪句语句有错误? int x=0; x=5.0/2;//不能把double型赋给整型 float y=12.5F; y=5.0/2;//不能把double型赋给float型 3.下列哪句语句有错误? byte x=32; char c='a'; int n=c

JAVA-初步认识-第三章-比较运算符逻辑运算符

一. 运算符的总类 先列举所有的运算符类型:算术运算符,赋值运算符,比较运算符,逻辑运算符,位运算符,三元运算符. 命名为什么叫运算符,英文叫operator, 难道说这是对操作的符号化表示?可以着一些英文的原版书籍来看. 本节将讨论比较运算符和逻辑运算符,这些仍旧属于java语言基础.等到讲完语法,函数,和数组之后,才是真正进入java语言的研究. 二. 在探讨比较运算符之前,先将视频中遇到的一个问题再重新学习一下.这里DOS报的错是没有找到主类,产生这样问题的原因只有两个:java运行的类名

标准库》第三章 包装对象和Boolean对象

第三部分  标准库 ***************第三章   包装对象和Boolean对象******************* 一.包装对象的定义[1]有人说,JavaScript语言"一切皆对象",数组和函数本质上都是对象,就连三种原始类型的值--数值.字符串.布尔值--在一定条件下,也会自动转为对象,也就是原始类型的"包装对象". 所谓"包装对象",就是分别与数值.字符串.布尔值相对应的Number.String.Boolean三个原生对象

Java学习笔记—第三章

第三章  标识符.关键字和数据类型 1. Java标识符和关键字:在程序设计中,通常用一个记号对变量.常量.方法和类等进行标识,这个记号称为标识符.Java语言本身使用了一些标识符,这些标识符称为Java关键字,用户在命名标识符时应该避免使用这些Java关键字,否则将导致程序无法进行编译. Java中的关键字如下: abstract 抽象 assert 断言 boolean 布尔 break 中断 byte 字节 catch 捕获 char 字符 class 类 continue 继续 defa

【算法竞赛入门经典】【第三章】课后习题(第一部分)

课后习题第三波来了,到第三章之后代码之类的稍微变长了一些,所以我把这一章的答案分为几部分.这一章重点是字符串的处理,对于字符串问题,通常只要细心就没有问题了,下面不多说了直接上详解. 习题3-1 分数统计(stat) 任务1:这个比较简单就直接上代码了: #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAXN 100 + 10 int cmp(const void*a,const v

第三章 数据处理

第三章  处理数据 3.1  简单变量 3.1.1  变量名 C++标识符命名规则如下:    ●  在名称中只能使用字母字符.数字和下划线    ●  名称的第一个字符不能是数字   ●  区分大写字母和小写字母   ●  不能将C++关键字用作名称   ●  以两个下划线或下划线和大写字母开始的名称被保留给实现(编译器及其资源)使用,以一个下划线开头的名称被保留给实现(库函数的实现).   ●  C++对名称的长度没有限制,但是某些平台有限制 3.1.2  命名方案 在变量名中使用变量类型作