V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaoshangmin
V2EX  ›  PHP

求教几个 php 问题

  •  
  •   xiaoshangmin · 2016-04-26 19:35:23 +08:00 · 2307 次点击
    这是一个创建于 3140 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 条附言  ·  2016-04-27 15:50:27 +08:00
    谢谢各位解答
    13 条回复    2016-04-27 08:59:40 +08:00
    usapla
        1
    usapla  
       2016-04-26 19:36:37 +08:00
    我都不知道。。。
    UnisandK
        2
    UnisandK  
       2016-04-26 20:05:50 +08:00   ❤️ 1
    .和数字挨着就是小数点了, var_dump('a'.0);在 0 前边打个空格就不会报错了
    你可以试试 var_dump(.0);和 var_dump(. 0);
    fising
        3
    fising  
       2016-04-26 20:15:15 +08:00
    在 0 前面敲两个 .. 就不会错了,应该是优先级的问题
    UnisandK
        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
    UnisandK
        5
    UnisandK  
       2016-04-26 20:24:38 +08:00   ❤️ 1
    9>09 是因为 0 开头的数字在 PHP 里是表示八进制数的,你 var_dump(07)和 var_dump(08)看看
    Slienc7
        6
    Slienc7  
       2016-04-26 20:24:51 +08:00
    .0 是 0.0
    然后成了 “文本 数值”

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

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

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

    --- ---

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

    var_dump(. 0); 报语法错误
    UnisandK
        9
    UnisandK  
       2016-04-26 20:41:34 +08:00   ❤️ 1
    精度损失的问题无非就是其中一个先把 double 转成了 string ,所以归根结底是 double 的 58 被转成 int 为什么会变成 57 。建议先学习下精度损失是怎么造成的,再考虑要不要把帽子扣在 PHP 头上
    jhdxr
        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')吧
    jhdxr
        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 被识别为一个数字了
    fising
        12
    fising  
       2016-04-26 21:20:29 +08:00
    @jhdxr 我说的优先级不是运算优先级,是解析优先级
    baiyi
        13
    baiyi  
       2016-04-27 08:59:40 +08:00
    新手表示 涨姿势了!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1988 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:25 · PVG 08:25 · LAX 16:25 · JFK 19:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.