PHP 字符串的隐式转换规则以及针对包含字母的字符串的递增/递减操作
之前一直对 PHP 中关于字符串的算数运算隐式类型转换规则和递增/递减操作符针对字符串的操作比较模糊,今天总结一下。
一、隐式转换
二进制算术运算符的隐式类型转换规则(http://php.net/manual/zh/language.types.string.php)
| 第一个操作数类型 | 第二个操作数类型 | 类型转换 |
| 整型 | 浮点型 | 整型转换为浮点型 |
| 整型 | 字符串 | 字符串转换为数字,如果字符串转换后是浮点型,整型也会转换为浮点型 |
| 浮点型 | 字符串 | 字符串转换为浮点型 |
总结一下就是浮点型 > 整型 > 字符串。例如:
整型 + 浮点型 = 浮点型
$a = 12;
$b = 1.5;
$c = $a + $b; var_dump($c); // float 13.5
整型 + (非 数字和. 开头的)字符串 = 整型
$a = 12;
$b = 'hello1.5';
$c = $a + $b; var_dump($c); // int 12
这里 $b 从字符串转换成整型后变成了 0
整型 + 浮点型数字开头的字符串 = 浮点型
$a = 12;
$b = '1.5hello';
$c = $a + $b; var_dump($c); // float 13.5
$b 自动转换成了 float 1.5
整型 + 整型数字开头的字符串 = 整型
$a = 12;
$b = '1hello';
$c = $a + $b; var_dump($c); // int 13
整型 + 浮点型数字的字符串 = 浮点型
$a = 12;
$b = '1.5';
$c = $a + $b; var_dump($c); // float 13.5
整型 + (以.开头的)字符串 = 浮点型 或 整型
$a = 12;
$b = '.5hello';
$c = $a + $b; var_dump($c); // float 12.5
$b 转换成了 0.5
$a = 12;
$b = '.hello';
$c = $a + $b;
var_dump($c); // int 12
$b 不会转换为 float 0.0 而是转换成 int 0
整型 + 包含大写 E 或小写 e 的字符串(需要满足科学记数法的格式,必须要有尾数) = 浮点型
$a = 1;
$b = '1e3';
$c = $a + $b; var_dump($c); // float 1001
$a = 1;
$b = '1e-3';
$c = $a + $b; var_dump($c); // float 1.001
整型 + 十六进制数字的字符串 = 整型
$a = 1;
$b = '0x10';
$c = $a + $b; var_dump($c); // int 17
二、自动递增/递减操作符
字母的自动递增
| 自动递增 | 结果 |
| "a" | "b" |
| "z" | "aa" |
| "spaz" | "spba" |
| "b9" | "c0" |
| "12" | "13" |
例1:一个字母进行递增,结果是它在字母表中的下一个字母
$a = 'a';
var_dump(++$a); // string 'b' (length=1)
例2:
$a = 'a';
var_dump(--$a); // string 'a' (length=1)
例3:"z" 或 "Z" 进行递增,会变成 "a" 或 "A",且字符左边的字符再递增(如果结果的 "a" 或 "A" 位于字符串左边第一个字符,那么还需要在它的左边再插入一个 "a" 或 "A")
$a = 'z';
var_dump(++$a); // string 'aa' (length=2)
例4:
$a = 'z1';
var_dump(++$a); // string 'z2' (length=2)
例5:
$a = 'z9';
var_dump(++$a); // string 'aa0' (length=3)
例6:
$a = 'b9';
var_dump(++$a); // string 'c0' (length=2)
例7:
$a = 'spaz';
var_dump(++$a); // string 'spba' (length=4)
例8:
$a = 'bz';
var_dump(++$a); // string 'ca' (length=2)
例9:
$a = '1z';
var_dump(++$a); // string '2a' (length=2)
例10:
$a = '*a';
var_dump(++$a); // string '*b' (length=2)
例11:
$a = '*a*';
var_dump(++$a); // string '*a*' (length=3)
例12:
$a = 'a*';
var_dump(++$a); // string 'a*' (length=2)
PHP 字符串的隐式转换规则以及针对包含字母的字符串的递增/递减操作的更多相关文章
- MySQL SQL优化之字符串索引隐式转换
之前有用户很不解:SQL语句非常简单,就是select * from test_1 where user_id=1 这种类型,而且user_id上已经建立索引了,怎么还是查询很慢? test_1的表结 ...
- mysql字符串的隐式转换导致查询异常
如果mysql某个字段(name)类型为varchar, 加了索引,在执行where查询的时候,传入了int的值,这样就会全表扫描,把每一条的值都转换成int(会出现"中国"-&g ...
- JavaScript 隐式类型转换
JavaScript 隐式类型转换 原文:https://blog.csdn.net/itcast_cn/article/details/82887895 · 1.1 隐式转换介绍 · 1.2 隐式转 ...
- [Effective JavaScript笔记]第3条:当心隐式的强制转换
js对类型错误出奇的宽容 3+true; //4 3*””; //0 3+[]; //3 3+[3]; //33 以上表达式在许多语言早就变红了.而js不但不报错还给你个结果. 极少情况会产生即时 ...
- Scala模式匹配| 隐式转换
1. 模式匹配 Scala中的模式匹配类似于Java中的switch语法,但是更加强大.模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分 ...
- Scala 隐式(implicit)详解
文章正文 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 1.Spark 中 ...
- 深入js系列-类型(隐式强制转换)
隐式强制转换 在其可控的情况下,减少冗余,让代码更简洁,很多地方都进行了隐式转换,比如常见的三目表达式.if().for().while.逻辑运算符 || &&,适当通过语言机制,抽象 ...
- python+selenium显示等待、隐式等待和强制等待的区别
在实际使用selenium或者appium时,等待下个等待定位的元素出现,特别是web端加载的过程,都需要用到等待,而等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,在selenium中(a ...
- 每天多一点(2016.12.04)》Javascript隐式转换
乱想 javascript为什么需要隐式转换?如果没有会出现什么情况? 找了一圈没有看到关于这个的讨论,只好自己研究了,可能不一定正确,自行辨知. 郁闷就是郁闷在好好的,为什么要搞个隐式转换,一般来讲 ...
随机推荐
- Mac中安装Vim7.4
Mac上的Vim Mac本身其实是预装了Vim的,但是目前的系统中都是Vim7.3版本的,而最新的Vim已经是7.4版了,因此为了能够使用最新版的vim,必须要对Mac中的vim要么升级,要么重装.在 ...
- dos 下删除文件、文件夹
删除文件 /p 删除每一个文件之前提示确认/f 强制删除只读文件 /s 从当前目录及所有子目录删除指定文件/q 安静模式.删除全局通配符时,不要求确认/a 根据属性选择要删除的文件 指定下列文件属性中 ...
- Ubuntu16.04 安装MATALAB R2015b教程
1.安装 将镜像文件内文件解压出来,添加执行权限,否则执行 ./install指令会出错 chmod -R 777 MATALAB 执行如下指令 ./install 2.填入补丁内的密匙 在Matla ...
- 在MVC中实现文件的上传
@using (Html.BeginForm("daoru", "Excel", FormMethod.Post, new { enctype = " ...
- 5.openstack之mitaka搭建计算节点
部署计算节点(compute服务) 一:控制节点配置 1.建库建用户 CREATE DATABASE nova_api; CREATE DATABASE nova; GRANT ALL PRIVILE ...
- showModalDialog打开页面有缓存,不走action
当你设置的弹出网页固定时,ie很可能到临时文件区,下载上次产生的该页面,而没有重新加载, 对于动态加载的页面来说,这样往往产生误会,如没有及时更新数据,也就更不利于开发者测试.所以,你可以采用如 ...
- C++ 基础知识复习(一)
数据类型,常量与变量部分:(发现有些点竟然这么多年第一次发现) C++基本数据类型有哪些: 答:整型,浮点型,void型. 注:其他各种数据类型均是这三种类型的扩充,另外void类型在实际程序中经常用 ...
- Handlebars块级Helpers
1.Handlebars简单介绍: Handlebars是JavaScript一个语义模板库,通过对view和data的分离来快速构建Web模板.它采用"Logic-less templat ...
- WPF播放视频
在现在的项目中需要使用到播放视频的功能,本来打算使用VLC来做的.后来发现WPF 4.0之后新增了MediaElement类,可以实现视频播放. <Grid> <Grid.RowDe ...
- haohantech浩瀚盘点机“PDA无线订货开单”终端 移动现场下单APP(打印扫描一体)
手持PDA盘点机,订货的时候,用PDA上自带的激光扫描头扫描(或手输)样品的条码,然后,只需输入该款产品不同尺码的数量即可自动(或手动)发送订货数据到总部服务器.盘点机“PDA无线订货”终端功能: 1 ...