计算机工作原理
计算机的核心是一个中央处理器(CPU)。这本质上是一个数学机器。它对数字执行加法、减法和其他算术运算。当你操作你的电脑时,你所看到的一切都是建立在CPU每秒处理数百万次数字的基础上的。
CPU将它所处理的数字存储在称为寄存器(register)的小内存单元中。CPU能够从计算机的主存储器(称为随机存取存储器(RAM))中将数字读入寄存器。它还能够将存储在寄存器中的数字写回RAM。这使得CPU能够处理大量的数据,而这些数据并不都适合存储在寄存器库中。
![](https://img.haomeiwen.com/i2270079/874eb606a0cba8e1.png)
当CPU将数值从RAM中提取到寄存器中时,它将在其数学单元中使用这些值,并将结果存储在另一个寄存器中。
每当CPU执行加法、减法、从RAM读取或向RAM写入操作时,它都在执行一条指令。每个计算机程序通常由成千上万条指令组成。一个复杂的计算机程序,比如您的操作系统macOS(是的,这也是一个计算机程序!),可能总共有数百万条指令。
编写单独的指令来告诉计算机该做什么是完全可能的,但是对于除最简单的程序之外的所有程序,这将是非常耗时和乏味的。这是因为大多数计算机程序的目标远不止简单的数学——计算机程序可以让你上网、处理图像、和朋友聊天。
您不是编写单独的指令,而是用特定的编程语言编写代码,例如使用Swift语言。代码通过一个叫做编译器的计算机程序,编译器把代码转换成CPU知道如何执行的指令。你写的每一行代码都会变成许多指令——有些行可能会变成几十条指令!
代码注释Code comments
单行注释
// This is a comment. It is not executed.
多行注释
// This is also a comment.
// Over multiple lines.
/* This is also a comment.
Over many..
many...
many lines.
*/
嵌套注释
/* This is a comment.
/* And inside it
is
another comment.
*/
Back to the first.
*/
算术运算Arithmetic operations
简单运算
- 加: +
- 减: -
- 乘:*
- 除:/
2 + 6
10 - 2
2 * 4
24 / 3
书写格式
2+6 // OK
2 + 6 // OK
2 +6 // ERROR
2+ 6 // ERROR
取模运算
整数类型取模
28 % 10 //8
浮点数类型取模
(28.0).truncatingRemainder(dividingBy: 10.0) //8
移位操作Shift operations
左移shift left
和右移操作shift right
采用十进制数的二进制形式,并分别将数字向左或向右移动。然后返回新的二进制数的十进制形式。
例如,二进制中填充为8位的十进制数字14是00001110。左移两位得到00111000,转换为十进制数是56。
![](https://img.haomeiwen.com/i2270079/272f83ab69dc6de1.png)
- Shift left: <<
- Shift right: >>
1 << 3 //8 1乘以2的3次方
32 >> 2 //8 32初一2的2次方
使用移位的一个原因是使乘或除2的幂(2的几次方)变得容易。注意左移1等于乘以2,左移2等于乘以4,以此类推。同样地,右移1等于除以2,右移2等于除以4,以此类推。
在过去,代码经常使用这种技巧,因为对CPU来说,移位比特(bits)要比复杂的乘法和除法运算简单得多。因此,如果使用移位,代码会更快。然而,现在的cpu要快得多,编译器甚至可以将乘方和除法转换为移位。因此,您将看到只有在进行二进制操作时才会发生移位,除非您成为一名嵌入式系统程序员,否则您可能不会看到这种情况!
数学函数Math functions
Swift还提供了大量的数学函数供您在必要时使用。你永远不知道什么时候你需要用到一些三角函数,尤其是当你是Swift的一名专业人员并编写那些复杂的游戏时!
sin(45 * Double.pi / 180)
// 0.7071067811865475
cos(135 * Double.pi / 180)
// -0.7071067811865475
(2.0).squareRoot() //2.0的平方根
// 1.414213562373095
(4.0).squareRoot() //4.0的平方根
//2.0
max(5, 10)
// 10
min(-5, -10)
// -10
Double.pi / 2
//1.570796326794897
max((2.0).squareRoot(), Double.pi / 2)
// 1.570796326794897
命名数据Naming data
最简单地说,计算机编程就是操作数据。记住,您在屏幕上看到的所有内容都可以简化为发送给CPU的数字。有时,您将这些数据表示为各种类型的数字,并对其进行处理,但其他时候,数据以更复杂的形式出现,比如文本、图像和集合。
在你的Swift代码中,你可以给每一段数据起一个名字,以后你可以用来引用它。名称后面跟一个关联类型,该类型表示名称所引用的数据类型,例如文本、数字或日期。
常量
let number: Int = 10
它声明一个名为number的常量,类型为Int,然后将该常量的值设置为10。
let pi: Double = 3.14159
let anotherDecimal: Float = 1.234
事实上,Double的精度是Float的两倍,这就是为什么它一开始就被称为Double。浮点数占用的内存比双精度浮点数少,但通常,对数字的内存使用不是一个大问题,而且在大多数地方都使用双精度浮点数。
变量
当您知道需要更改某些数据时,应该使用变量来表示该数据,而不是使用常量。您可以用类似的方式声明一个变量,如下所示:
var variableNumber: Int = 42
一旦您声明了一个变量,您就可以随意地将它更改为您想要的数值,只要类型保持不变。例如,要更改上面声明的变量,可以这样做:
variableNumber = 0
variableNumber = 1_000_000
注意:在Swift中,您可以选择使用下划线使更大的数字更易于人阅读。下划线的数量和位置由您决定。
使用有意义的名字进行数据的命名 Using meaningful names
始终为变量和常量选择有意义的名称。好的名称可以充当文档,使代码易于阅读。
使用驼峰命名方式:
- 以小写字母开头。
- 如果名称由多个单词组成,则将它们连接在一起,并每隔一个单词以大写字母开始。
- 如果其中一个单词是缩写,则将整个缩写用相同的大小写写下来(例如:sourceURL和urlDescription)。
var 🐶💩:Int=-1
虽然你可以使用Unicode字符为变量命名,但是在实际编程过程中还是不要这么做
递增和递减Increment and decrement
var counter: Int = 0
counter += 1
// counter = 1
counter -= 1
// counter = 0
counter = 10
counter *= 3 // same as counter = counter * 3
// counter = 30
counter /= 2 // same as counter = counter / 2
// counter = 15
翻译自Raywenderlich的Swift书籍Swift Apprentice
网友评论