var_dump('a'.0);//语法错误
var_dump('a' . 0);//点连接左右加上空格就不会语法错误是为什么?
//为什么下面输出不是 a-z?
for ($i='a';$i<='z';++$i){
echo "$i ";
}
//精度为什么丢失?
$f=0.58;
echo intval($f*100);
echo intval(strval ($f*100))//这样就不会
if(9>09){
echo 'ok';
}
1
usapla 2016-04-26 19:36:37 +08:00
我都不知道。。。
|
2
UnisandK 2016-04-26 20:05:50 +08:00 1
.和数字挨着就是小数点了, var_dump('a'.0);在 0 前边打个空格就不会报错了
你可以试试 var_dump(.0);和 var_dump(. 0); |
3
fising 2016-04-26 20:15:15 +08:00
在 0 前面敲两个 .. 就不会错了,应该是优先级的问题
|
4
UnisandK 2016-04-26 20:19:48 +08:00 1
第二个问题官方文档有写
PHP follows Perl's convention when dealing with arithmetic operations on character variables and not C's. For example, in PHP and Perl $a = 'Z'; $a++; turns $a into 'AA', while in C a = 'Z'; a++; turns a into '[' (ASCII value of 'Z' is 90, ASCII value of '[' is 91). Note that character variables can be incremented but not decremented and even so only plain ASCII alphabets and digits (a-z, A-Z and 0-9) are supported. Incrementing/decrementing other character variables has no effect, the original string is unchanged. 参考 http://php.net/manual/en/language.operators.increment.php |
5
UnisandK 2016-04-26 20:24:38 +08:00 1
9>09 是因为 0 开头的数字在 PHP 里是表示八进制数的,你 var_dump(07)和 var_dump(08)看看
|
6
Slienc7 2016-04-26 20:24:51 +08:00
.0 是 0.0
然后成了 “文本 数值” 机智的类型转换,你做完 ++ , $i 就成 数值了 。 浮点数被转换为整数,精度丢失应该正常状况,这应该怪 C ? php.net 手册下的 UCN ,基本都是这种东西。 --- --- 以上都是口胡, PHP 是最好的语言。 |
8
hwttechnology 2016-04-26 20:38:55 +08:00
var_dump(.0); 结果是 double(0)
var_dump(. 0); 报语法错误 |
9
UnisandK 2016-04-26 20:41:34 +08:00 1
精度损失的问题无非就是其中一个先把 double 转成了 string ,所以归根结底是 double 的 58 被转成 int 为什么会变成 57 。建议先学习下精度损失是怎么造成的,再考虑要不要把帽子扣在 PHP 头上
|
10
jhdxr 2016-04-26 20:47:25 +08:00 4
我补充下 @UnisandK 的回答,为什么不是 'a' - 'z',是因为 `for(AA;BB;CC)` 是相当于
``` AA; while(BB){ //stmt CC } ``` 那么当累加到 'z' 后,再累加一次就成了 'aa' (参照文档说明),而根据字符串比较规则, 'aa' < 'z'。只有一直累加到 'za' 才是大于 'z' 的。 如果想要 a 到 z 直接 range('a', 'z')吧 |
11
jhdxr 2016-04-26 21:19:36 +08:00 3
@fising 不是优先级的问题,你 LS @UnisandK 给出了正解。至于敲两个就不报错是因为 `'a'..0` 被解释成了 `'a'` `.` `.0`,也就是字符串 'a' 和数字 0 进行拼接
btw ,介绍个函数: http://php.net/manual/zh/function.token-get-all.php 以 LZ 所说的为例 ``` $arr = token_get_all("<?php var_dump('a'.0);"); var_dump(array_map(function($a){ if(is_array($a)) { $a[4] = token_name($a[0]); } return $a; }, $arr)); ``` 结果为 array(7) { [0]=> array(4) { [0]=> int(379) [1]=> string(6) "<?php " [2]=> int(1) [4]=> string(10) "T_OPEN_TAG" } [1]=> array(4) { [0]=> int(319) [1]=> string(8) "var_dump" [2]=> int(1) [4]=> string(8) "T_STRING" } [2]=> string(1) "(" [3]=> array(4) { [0]=> int(323) [1]=> string(3) "'a'" [2]=> int(1) [4]=> string(26) "T_CONSTANT_ENCAPSED_STRING" } [4]=> array(4) { [0]=> int(318) [1]=> string(2) ".0" [2]=> int(1) [4]=> string(9) "T_DNUMBER" } [5]=> string(1) ")" [6]=> string(1) ";" } 可以很直接的看出 .0 被识别为一个数字了 |
13
baiyi 2016-04-27 08:59:40 +08:00
新手表示 涨姿势了!
|