Swift入门(八)——功能强大的求余运算符

求余运算符

在大部分语言中,%都是求余运算符。其功能非常简单,不过也只支持int类型正数之间的求余。 比如 10 % 3 = 1。

严格来说,正整数之间的求余的定义如下:

对于任意a,b∈N*,定义m = a % b,其中m满足:

a = b * m + r且0 <= r < b

Swift中的求余

使用场景拓展

Swift中的求余,不再是两个int类型正数之间的运算符了。不仅负数可以求余,浮点数也可以求余。

浮点数求余规则

首先不考虑符号看一下浮点数求余,其定义与正整数之间的求余非常类似。这里就不再赘述,举个例子

var c = 10.5 % 3
println("c = \(c)") // 输出结果是c = 1.5

需要注意的是,求余运算符不要求两端变量类型严格相等。因此这样的写法毫无问题。当然两个浮点数之间的求余也是可以的。

负整数求余规则

比如我想求10 % -3或者-10 % 3的结果,答案就不如浮点数求余一样简单了。

其实不妨回头看一看正整数求余的定义:

a = b * m + r

做一下简单的化简就可以得到以下两个等式:

a = (-b) * (-m) + r //对b * m做等价变换

-a = b * (-m) + (-r) //等式两边同时乘以-1

因此负数的求余法则其实也非常简单,即

%号右侧的数取相反数,运算结果不变

%号左侧的数取相反数,运算结果取相反数

因此,可以得到以下四个运算结果:

10 % 3 = 1     //我们都知道的等式一
-10 % 3 = -1   //和等式一结果互为相反数
10 % -3 = 1    //和等式一结果相等
-10 % -3 = -1  //和等式二结果相等

如果依然不放心的话还可以写个非常简单的程序验证一下:

for var a = 0; a < 100; ++a{
    println("\(a) % 5 = \(a % 5)")
    println("\(a) % -5 = \(a % -5)")
    println("\(-a) % 5 = \(-a % 5)")
}

这里必须使用++a而不是a++,否则编译器会报错。-a运用了阴阳运算符,对a的值取相反数。

负数浮点数求余

综合运用负整数和浮点数求余规则即可得出答案。

总结:

Swift中的求余运算符功能十分强大。不过可能在大多数情况下依然是在正整数之间使用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-05 11:42:28

Swift入门(八)——功能强大的求余运算符的相关文章

C言语除法运算符“/和求余运算符“%

看似两个很简单的运算符.这篇文章作为对于此类运算符的各方面的疑问的汇总,却也真要把握用好它也不容易.期望对你都有一些帮助.     除法运算符"/二元运算符,具有左联系性.参加运算的量均为整型时,成果为整型,舍去小数.假如运算量中有一个为实型,成果为双精度实型. 例如:5/2=21/2=05/2.0=2.5          求余运算符"%二元运算符,具有左联系性.参加运算的量均为整型求余运算的成果等于两个数相除后的余数 例如:5%2=11%2=15%2.0和5.0%2成果是语法错误

Swift学习笔记-基本运算符(Basic Operators)-求余运算符

求余运算(a % b)是计算b的多少倍刚刚好可以容入a,返回多出来的那部分(余数). 注意:求余运算(%)在其他语言也叫取模运算.然而严格说来,我们看该运算符对负数的操作结果,"求余"比"取模"更合适些. 我们来谈谈取余是怎么回事,计算9 % 4,你先计算出4的多少倍会刚好可以容入9中: 2倍,非常好,那余数是1(用橙色标出) 在 Swift 中可以表达为: 9 % 4 // 等于 1 为了得到a % b的结果,%计算了以下等式,并输出余数作为结果: a = (b

求余运算符

笔记摘自<极客学院> 求余运算(a % b)是计算b的多少倍刚刚好可以容入a,返回多出来的那部分(余数). 注意:求余运算(%)在其他语言也叫取模运算.然而严格说来,我们看该运算符对负数的操作结果,"求余"比"取模"更合适些. 我们来谈谈取余是怎么回事,计算9 % 4,你先计算出4的多少倍会刚好可以容入9中: 2倍,非常好,那余数是1(用橙色标出) 在 Swift 中可以表达为: 9 % 4 // 等于 1 为了得到a % b的结果,%计算了以下等式,并

Swift入门(九)——String与Int、Double、Float等数字相互转换

三种转换模式 任何语言里面,Int.float.double等数字类型自成一派,但它们和String类型之间的转换总是不太方便,这里总结一下它们相互转换的方法.总结下来一共有三种转换模式,分别举例说明. 一.String转数字 这里以String类型转Int类型为例.String转其他的数字类型(Float.Double等)大同小异.主要用到的方法是String类型的toInt方法.注意这个方法返回的是Int?,即一个整数可选类型.所以需要解封. var string = "1234"

Swift入门(十二)——利用Extension添加逆序输出字符串方法

Swift好像没有自带逆序输出字符串的方法,于是决定通过拓展(Extension)给String类添加一个逆序输出字符串的reverse方法. 首先新建一个Swift文件,命名规则不太清楚,于是暂且模仿OC叫做String+Operation吧,然后实现我们需要拓展的方法.下面先贴上代码,然后解释一下这段代码. //String+Operation.swifft import Foundation //逆序输出swift中的字符串 extension String{ func Reverse()

Swift入门(十一)——类型转换与is、as操作

三种操作:is.as?和as! Swift是强类型语言,但也允许开发者通过is.as?和as!这三种操作来对类型进行判断和强制转换.其中is用作类型判断,而as?和as!则分别是类型转换的可选形式和强制形式.在这里强调一下,swift中比较常用的向下转换(downcast)是没有as操作符的. 为了方便后面的解释,这里假设定义了三个类,Fruit.Apple和Orange,其中Apple和Orange都继承自Fruit. is操作符 is操作用来判断某一个对象是否是某一个特定的类,它会返回一个b

Swift入门(一)——基本的语法

近期開始学习swift.把学习的过程和总结整理成一个系列.方便日后回想总结. 基本的语法 基础语法 swift中每一行结束后不须要加分号.多个语句在同一行内须要用分好隔开 //表示凝视.或者用/* --*/ 常量 常量是指定义之后无法改动值的量,比方设置一个最大尝试登陆的次数,它的值一旦被确定,就不应该在程序中被改动.swift中的常量用let表示.定义方法例如以下: let maxAttemptTime = 3 //正确 maxAttemptTime = 4 //错误.常量一旦定义不能够改变

IOS开发语言Swift入门连载---闭包

IOS开发语言Swift入门连载-闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的 lambdas 函数比较相似. 闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.Swift 会为您管理在捕获过程中涉及到的所有内存操作. 注意: 如果您不熟悉捕获(capturing)这个概念也不用担心,您可以在 值捕获 章节对其进行详细了

Swift入门教程:基本运算符

基本运算符 Swift所支持的基本运算符 赋值运算符:= 复合赋值运算符:+=.-= 算数运算符:+.-.*./ 求余运算符:% 自增.自减运算符:++.-- 比较运算符:==.!=.>.<.>=.<= 逻辑运算符:&&.||.! 三目运算符:? : 范围运算符:.. .... 赋值运算符 单对单赋值 var a = 5 let b = 20 多对多赋值 var (x, y) = (1, 2) // x的值是1,y的值是2 跟C\OC不一样的是:Swift的赋值运算