PHP 中「自增、自减」运算引发的奇怪问题

PHP 中「自增、自减」运算引发的奇怪问题

在 PHP 的官方手册中写道:

PHP 支持 C 风格的前/后递增与递减运算符。

第一个注意事:递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增 NULL 的结果是 1。

换句话说:递增/递减运算中,不会把操作数转换成整数后再运算。如果运算数是布尔值,则直接返回结果。

递增/递减布尔值:


  1. $a = TRUE;
  2. var_dump(++$a); // bool(true)
  3.  
  4. $a = TRUE;
  5. var_dump(--$a); // bool(true)
  6.  
  7. $b = FALSE;
  8. var_dump(++$b); // bool(false)
  9.  
  10. $b = FALSE;
  11. var_dump(--$b); // bool(false)

递增/递减 NULL:


  1. $a = NULL;
  2. var_dump(++$a); // int(1)
  3. $a = NULL;
  4. var_dump(--$a); // NULL

在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。

例如,在 Perl 中


  1. $a = 'Z';
  2. $a++;

将把 $a 变成 'AA',而在 C 中,


  1. a = 'Z';
  2. a++;

将把 a 变成 '['('Z' 的 ASCII 值是 90,'[' 的 ASCII 值是 91)。

注意字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。

例如:


  1. $a="9D9";
  2. var_dump(++$a); // string(3) "9E0"

但是,这里又有一个陷阱了:


  1. $a="9E0";
  2. echo ++$a; // 10

安装上面的规则,应该输出 9E1,但是这里却输出了 10。WTF?

如果我们这么写,大部人就知道是为什么了。


  1. $a = "9E0";
  2. var_dump(++$a); // float(10)

$a 的类型是浮点型,也就是说,9E0 是浮点数的科学记数法,即 9 * 10^0 = 9,对 9 自增,结果当然是 10 了。(参考:字符串转换为数值

现在问题又来了:


  1. $l = "Z99";
  2. $l++;

这个结果是多少呢?结果按照 perl 语言的规则,是 "AA00"。

还有一个注意事项:

递增/递减其他字符变量则无效,原字符串没有变化。

这个就不解释了。

最后一个注意事项:


  1. $a = '012';
  2. $a++;
  3. var_dump($a);

这个结果是 '013'?13?11?

这段的结果是 int(13),字符串 '012' 并没有被当作八进制。


  1. $a = 012; // 八进制,十进制为 10
  2. $b = "012"; // 转换为整数为十进制 12

如果是 0x 开头的呢?


  1. $a = '0x1A';
  2. $a++;
  3. var_dump($a); // int(27)

WTF!居然不按套路出牌。0 开头的不被认为是八进制,但是 0x 开头的却被认为是十六进制。

在 PHP 官方文档中 Integer 整型 还有另一个八进制陷阱:


  1. var_dump(01090); // 八进制 010 = 十进制 8

手册中对此的解释为:

Warning
如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略。

综上,PHP 不愧是世界上「最好」的语言。

没有之一。

原文发布时间:2015-02-03

本文来自云栖合作伙伴“linux中国”

时间: 2024-10-25 05:47:21

PHP 中「自增、自减」运算引发的奇怪问题的相关文章

PHP中自增自减运算

PHP中自增自减运算  问题:若$i=2,求表达式($i++)*($i++)*($i++)的值,并求$i的值  答案:($i++)*($i++)*($i++)结果为24,$i为5  分析:先看计算顺序,发现有括号则先算括号里面的,先取$i的值2为($i++)的值,然后$i自加为3:  [此时($i++)左=2,$i=3]             再算括号中,先取此时的$i的值3为($i++)的值,然后$i再自加为4:[此时($i++)中=3,$i=4]             后算括号右,先取此

「用 AI 识别 xxx」,真的靠谱么?

最近不少人工智能和计算机视觉的学者,带着自己的机器学习技术投身于心理学研究.出发点很好:用更新的技术探究问题.但是他们的成果让人担心.前有用人工智能分析潜在罪犯,后有用人工智能分辨性取向.这些论文都引发了轩然大波.不少人抨击之点就是伦理问题.其这些文章的科研问题也存在.相比于安防领域的面孔身份识别广受赞誉,那一类分析潜在罪犯潜在性格的机器学习研究其实都有值得推敲指出. 简单粗暴一句话:目前「用 AI 识别 xxx」一类研究,没想象中靠谱,不要轻信. 就让我们从斯坦福大学学者训练人工智能识别性取向

对话「平衡车之父」:把Solowheel带回中国

1986年,崔健在北京「纪念国际和平年百名歌星演唱会」上吼出了<一无所有>,来自西方的摇滚乐第一次在中国大陆扎下了根,在那个特殊的历史时期,「迎进来」和「走出去」成了东西方文化融合与交流的重要符号,也是在这一年,Shane Chen(陈星)在北京农业大学获得农业气象学学位之后,前往美国闯荡. 次年,日本学者Kazuo Yamafuji教授创造出的一种基于陀螺仪的灵论平衡装置,并且在日本申请了一项专利,也就是最初平衡车的雏形,但当时只是停留在了实验室阶段,没有商业化,当初谁也没想到平衡车在二三十

「2017 AI 最佳雇主」评选,多家顶尖互联网企业已报名,关乎全球25万人工智能人才的未来

4 月中旬,雷锋网联合旗下人工智能频道 AI 科技评论.环球科学 和 BOSS 直聘,共同重磅推出 AI 领域第一份雇主评选榜:「2017 AI 最佳雇主」榜单. 榜单一经推出,就受到人工智能业界极大关注.报名启动一个月,已经有超过 70 家国内顶尖人工智能企业报名,其中代表性的企业有(此处介绍按首字母顺序排列): 360:中国领先的互联网络安全企业,汇聚了国内规模领先的高水平安全技术团队,并依托大数据.云计算平台.人工智能技术打造一系列智能硬件及提供多种互联网服务. 阿里云:提供云端运算服务的

斐波那契数列-Fibonacci数列 的疑问(一增一减的迭代法)

问题描述 Fibonacci数列 的疑问(一增一减的迭代法) 程序如下: int f = 0; int g = 1; for (int i = 0; i <= 15; i++) { println(f); f = f + g; g = f - g; } 输出:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 问题1:为什么是用一增一减实现的? 问题2:还有关初值f和g是怎么设定的? 谢谢! 解决方案 public int fibonacci(int n){

c++-运行定时器后内存持续的涨~不算太快但是只增不减

问题描述 运行定时器后内存持续的涨-不算太快但是只增不减 可以认为这个回调函数在不断的被调用-有试着delete pDlg 这个程式就退出来了-求解 解决方案 你定时器中不停的new生成对话框就会有内存泄露 你可以控制对话框显示隐藏来做到 而不是不停的创建

「为极致 敢追求」魅族校园行正式启动!

"你敢不敢追求极致?"5月起,http://www.aliyun.com/zixun/aggregation/24427.html">魅族科技携手网购潮(wanggouchao.com)和XDACN社区(www.xda.cn)席卷华中华南60所高校,在有"九省通衢"之称的武汉 举行大型巡展宣讲活动--"为极致•敢追求魅族校园行". 活动于5月12日开始,活动内容包括线上线下两环节,线下环节有大型路演体验.精彩的街舞表演.有趣的游戏

中国人寿去年净利336.26亿增银减股投资回稳

昨天,中国人寿保险股份有限公司(601628.SH,02628.HK,下称"中国人寿")在三家保险股中率先发布了2010年年报,中国人寿2010年实现净利润336.26亿元, 同比增长2.3%.保费收入则保持两位数增长. 净利微增2.3% 年报显示,在新会计准则下,2010年,中国人寿实现利润总额410.08亿元(人民币,下同),同比微减1.8%.营业利润410.11亿元,同比减少2%.归属于公司股东的净利润达336.26亿元,同比增长2.3%:每股收益(基本与稀释)1.19元. 在去

微信公众平台发布「公众号数据助手」官方小程序 方便手机查看公众号运营数据

昨晚,微信公众平台又搞事情,发布了「公众号数据助手」官方小程序,支持公众号管理员及运营者在手机端更方便.及时地查看运营数据.以后就可以在微信小程序就可以查看了,不用再用电脑登录才能访问.怎么操作呢?首先在小程序那搜索"公众号数据助手",点击进入( 哪里找到小程序 ) 01.帐号登录 已注册或绑定公众号的用户(包括公众号管理员.长期运营者和短期运营者),打开小程序首页可直接在列表中选择公众号登录.登录后点击帐号头像可以返回首页列表切换公众号. 02.用户分析 1.支持查看公众号的实时粉丝