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

一道 PHP 题,反正我是没想到

  •  
  •   abusizhishen · 2018-01-13 12:03:59 +08:00 via Android · 6409 次点击
    这是一个创建于 2510 天前的主题,其中的信息可能已经有所发展或是发生改变。

    $a="zzz"; $a++; echo $a; 请说出答案

    37 条回复    2018-01-14 10:12:32 +08:00
    kran
        1
    kran  
       2018-01-13 12:07:32 +08:00
    没想到。。
    我想洗地。
    lihongjie0209
        2
    lihongjie0209  
       2018-01-13 12:10:22 +08:00
    自己跑一遍不就知道答案了?
    choicky
        3
    choicky  
       2018-01-13 12:12:56 +08:00 via iPhone
    1 ?
    azoon
        4
    azoon  
       2018-01-13 12:14:45 +08:00
    以为是 aaa,结果是 aaaa
    dream7758522
        5
    dream7758522  
       2018-01-13 12:30:11 +08:00 via Android
    明显是故意显摆的题,字符串++,一般编程不会这样子写吧!
    zengzizhao
        6
    zengzizhao  
       2018-01-13 12:33:40 +08:00
    好吧,居然还会进位
    misaka19000
        7
    misaka19000  
       2018-01-13 12:44:26 +08:00 via Android   ❤️ 10
    新时代的茴香豆的四种写法
    dan2001go
        8
    dan2001go  
       2018-01-13 12:51:00 +08:00   ❤️ 2
    脑子有病才会出这样的题目来考人。
    klgd
        9
    klgd  
       2018-01-13 12:54:09 +08:00
    我知道 ++ 时 z 被转为 ascii 码 但是不知道值是多少
    klgd
        10
    klgd  
       2018-01-13 13:04:28 +08:00   ❤️ 1
    @klgd #9 我弄错了

    > 在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。例如,在 Perl 中 $a = 'Z'; $a++; 将把 $a 变成'AA',而在 C 中,a = 'Z'; a++; 将把 a 变成 '['('Z' 的 ASCII 值是 90,'[' 的 ASCII 值是 91 )。注意字符变量只能递增,不能递减,并且只支持纯字母( a-z 和 A-Z )。递增/递减其他字符变量则无效,原字符串没有变化。
    stooory
        11
    stooory  
       2018-01-13 13:05:45 +08:00
    yujieyu7
        12
    yujieyu7  
       2018-01-13 13:55:50 +08:00
    这面试人是想考察什么?

    字符变量的算数运算?

    他工作中就经常拿个字符串去这么运算?
    yangbin9317
        13
    yangbin9317  
       2018-01-13 14:54:22 +08:00
    看这里

    https://github.com/php/php-src/blob/master/Zend/zend_operators.c

    第 2417 2418 行

    switch (is_numeric_string(Z_STRVAL_P(op1), Z_STRLEN_P(op1), &lval, &dval, 0)) {
    case IS_LONG:
    zend_string_release(Z_STR_P(op1));
    if (lval == ZEND_LONG_MAX) {
    /* switch to double */
    double d = (double)lval;
    ZVAL_DOUBLE(op1, d+1);
    } else {
    ZVAL_LONG(op1, lval+1);
    }
    break;
    case IS_DOUBLE:
    zend_string_release(Z_STR_P(op1));
    ZVAL_DOUBLE(op1, dval+1);
    break;
    default:
    /* Perl style string increment */
    increment_string(op1);
    break;
    }
    mb135
        14
    mb135  
       2018-01-13 14:56:46 +08:00
    反正我是不会写这种代码的
    shiny
        15
    shiny  
       2018-01-13 15:00:52 +08:00   ❤️ 1
    谁要是代码写成这样,一个巴掌就拍过去了。
    zakokun
        16
    zakokun  
       2018-01-13 15:04:55 +08:00
    又来各种姿势黑 php 了,写 php 的能不能稍微提一点正常的问题?
    zakokun
        17
    zakokun  
       2018-01-13 15:05:24 +08:00
    zakokun
        18
    zakokun  
       2018-01-13 15:06:10 +08:00
    @zakokun https://www.v2ex.com/t/133080#reply45 顺便看一下 V2 的这个帖子,你能懂得更多
    aikunzhe
        19
    aikunzhe  
       2018-01-13 16:14:08 +08:00   ❤️ 1
    excel 导出时,制作表头用到,
    hoyixi
        20
    hoyixi  
       2018-01-13 16:58:16 +08:00
    楼上很多哥们抱怨“谁要是代码写成这样”~

    当然直接写成这种代码概率很小,但是这是考题啊,简化了,只给出问题实质。 实际中,很可能是$a 是一个输入,或者某个计算、拼接、调用等等的结果,如果对这个结果是字符串而非预期的数值,然后++,就出现题目中的情况了。
    sagaxu
        21
    sagaxu  
       2018-01-13 18:08:42 +08:00
    @hoyixi 会解这个考题,对解决类似 bug,一点儿帮助都没有
    nyanyh
        22
    nyanyh  
       2018-01-13 18:59:43 +08:00
    这不是一个文档看没看完整的问题吗
    hoyixi
        23
    hoyixi  
       2018-01-13 19:27:44 +08:00
    @sagaxu

    是的,所以给出一段 bug 代码和奇葩输入,然后要么让写输出结果,要么解释为啥得到意外的输出,最后问怎么改这段代码, 这样更有意义。

    不过笔试和笔试题早就变成形式主义了,纯筛选,网上荡一份或者题库抽一份,应付差事完事~
    guog
        24
    guog  
       2018-01-13 19:28:21 +08:00 via Android
    23333
    要不要来一个这样的呀~

    $a="9d9";
    $a++;
    echo $a;
    $a++;
    echo $a;
    pyufftj
        25
    pyufftj  
       2018-01-13 19:37:57 +08:00
    @dan2001go 说真的,笔试中经常遇到这样的题。
    Mitt
        26
    Mitt  
       2018-01-13 19:40:12 +08:00 via iPhone
    就是代码水平问题 换什么语言都一样 换 js 还不哭死你 这影响 js 的地位了吗?
    akira
        27
    akira  
       2018-01-13 20:04:17 +08:00
    @yangbin9317 问个问题,switch 的 default 不是最后一个了么,应该不需要加 break 了吧, 有什么特殊作用么
    X1r0z
        28
    X1r0z  
       2018-01-13 20:23:28 +08:00 via Android
    就想问这行代码有什么实际应用场景....
    SimbaPeng
        29
    SimbaPeng  
       2018-01-13 20:24:10 +08:00   ❤️ 1
    我就想问楼上一群 bb 题目脑残,实际中用不到等等的人,你们从小学到大的文言文,在你们实际工作生活中有用到过吗?如果没有,那你们当初学文言文的时候,怎么不跟老师说,脑子有病的人才学文言文,又用不到
    cjyang1128
        30
    cjyang1128  
       2018-01-13 20:40:55 +08:00
    @aikunzhe 学到了!!!!当时还是自己模拟了进制运算来写的,没想到还有这种解法
    abusizhishen
        31
    abusizhishen  
    OP
       2018-01-13 20:58:53 +08:00 via Android
    @yangbin9317 有点叼,不过表示我没看懂
    crist
        32
    crist  
       2018-01-13 21:36:33 +08:00
    PHP 是最好的语言,众喷退散!
    killerv
        33
    killerv  
       2018-01-13 22:06:49 +08:00
    没意义
    gidot
        34
    gidot  
       2018-01-13 23:22:41 +08:00
    这种题平时程序员之间用来解闷还行,面试如果我遇到类似的题就直接走掉。非常轻浮不礼貌的问题。
    changwei
        35
    changwei  
       2018-01-14 00:37:59 +08:00 via Android   ❤️ 3
    不是我黑 php,你去看看大厂的开源项目或者内部的代码,基本上所有涉及到变量运算,数据封装等操作,都会严格使用 strval,intval 之类的函数。

    我以前碰巧因为挖到某厂一个源码泄漏漏洞,有幸阅读了一下他们整套内部框架的源代码,基本上都是这么操作的。当然现在 php7 有强类型了肯定会更加方便。

    考察怪异代码的执行结果有什么意义?难道你们公司招聘的是 php 编译器开发者? php 是因为目前只有官方自己的编译器所以看似背下这些所谓的面试题好像很厉害的样子。如果换成 c++等编程语言,有各种编译器,不同编译器对一些奇葩写法的编译结果完全不一样,你是不是要把每个编译器的怪异行为都去测试一遍?
    abusizhishen
        36
    abusizhishen  
    OP
       2018-01-14 01:51:29 +08:00 via Android
    感谢各位,学到了
    Actrace
        37
    Actrace  
       2018-01-14 10:12:32 +08:00
    负责过很多面试。

    这个问题应该是希望考察应聘者的经验,特别是在 PHP 本身特性的了解程度上。
    对于某些涉及到运算的领域非常重要,因为 PHP 是弱类型语言,如果对弱类型不了解,很容易出现楼上各位提到的字符串问题。如果是开发账务系统,那确实是需要严谨的类型处理。

    不过上述所言是理想主义,我觉得这道题可以考验到经验程度,但是不能作为一个主要判断(写了 8 年 PHP 的我也是第一次碰到这个问题,大多数时候 PHP 主要用来处理字符串相关的问题,这是比 C 要方便很多的地方)。

    所以这道题实质上意义不大,毕竟对于大多数 PHP 岗位,我认为应聘者对语法的熟练程度要更重要一些,重要部分的经验问题可以通过统一的培训来补足。但是语法不行还得花时间慢慢熟悉,很致命。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3122 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 14:13 · PVG 22:13 · LAX 06:13 · JFK 09:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.