求教几个 php 问题

2016-04-26 19:35:23 +08:00
 xiaoshangmin

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';  

}

2302 次点击
所在节点    PHP
13 条回复
usapla
2016-04-26 19:36:37 +08:00
我都不知道。。。
UnisandK
2016-04-26 20:05:50 +08:00
.和数字挨着就是小数点了, var_dump('a'.0);在 0 前边打个空格就不会报错了
你可以试试 var_dump(.0);和 var_dump(. 0);
fising
2016-04-26 20:15:15 +08:00
在 0 前面敲两个 .. 就不会错了,应该是优先级的问题
UnisandK
2016-04-26 20:19:48 +08:00
第二个问题官方文档有写
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
UnisandK
2016-04-26 20:24:38 +08:00
9>09 是因为 0 开头的数字在 PHP 里是表示八进制数的,你 var_dump(07)和 var_dump(08)看看
Slienc7
2016-04-26 20:24:51 +08:00
.0 是 0.0
然后成了 “文本 数值”

机智的类型转换,你做完 ++ , $i 就成 数值了 。

浮点数被转换为整数,精度丢失应该正常状况,这应该怪 C ?

php.net 手册下的 UCN ,基本都是这种东西。

--- ---

以上都是口胡, PHP 是最好的语言。
Slienc7
2016-04-26 20:26:28 +08:00
@Slienc7 好吧,看了下文档并不对,果然还是应该看文档,请无视我的回复。
hwttechnology
2016-04-26 20:38:55 +08:00
var_dump(.0); 结果是 double(0)

var_dump(. 0); 报语法错误
UnisandK
2016-04-26 20:41:34 +08:00
精度损失的问题无非就是其中一个先把 double 转成了 string ,所以归根结底是 double 的 58 被转成 int 为什么会变成 57 。建议先学习下精度损失是怎么造成的,再考虑要不要把帽子扣在 PHP 头上
jhdxr
2016-04-26 20:47:25 +08:00
我补充下 @UnisandK 的回答,为什么不是 'a' - 'z',是因为 `for(AA;BB;CC)` 是相当于
```
AA;
while(BB){
//stmt
CC
}
```

那么当累加到 'z' 后,再累加一次就成了 'aa' (参照文档说明),而根据字符串比较规则, 'aa' < 'z'。只有一直累加到 'za' 才是大于 'z' 的。

如果想要 a 到 z 直接 range('a', 'z')吧
jhdxr
2016-04-26 21:19:36 +08:00
@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 被识别为一个数字了
fising
2016-04-26 21:20:29 +08:00
@jhdxr 我说的优先级不是运算优先级,是解析优先级
baiyi
2016-04-27 08:59:40 +08:00
新手表示 涨姿势了!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/274588

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX