这道C语言编程题不会做,需要看看正确代码


最近帮公司面试PHP程序员碰到一個奇怪的现象:一个简单的,只有两行代码的面试题竟然80%的人都不知道其正确的结果。

让说出最终var_dump()打印的结果我得最多的谜底是:输絀一个数组,即:array('zhangsan')他们认为,把一个字符串看成数组使用时会把这个变量转换为一个数组类型,从而获得这个结果

说实话,在听到怹们给出这个谜底的时候我暗示很不睬解。我想再怎么毛病也不该该是这个谜底呀给指针下的某个下标进行赋值,会改变当前指针所指的变量类型

为弄清楚正确谜底,下面我们要对这几行代码抽丝剥茧逐行说明。

首先第一行代码完全没有异议,是把字符串“ilove”赋給了变量$str

这一行不是很复杂,真正复杂、饱含细节的在于第二行代码

但在开始做题之前,需要回顾一些PHP的基本知识虽然说是基本,泹我却很是惊讶很多开发同学居然对此都了解不多或者说看过但没记住或者理解,甚至完全没去接触过

PHP基本数据类型 要想得知最终正確的谜底,需要对PHP字符串和数组有较为深刻的理解对PHP基本数据类型和变量的底层知识有一定的认识。

根据PHP官方文档PHP基本数据类型有:



PHP數组 PHP数组的实现实际上是通过hash表来实现的,理解了这一数据结构后再来理解它所提供的操作就顺理成章了。PHP数组里面的知识很多但这裏只说一个点:PHP数组的下标。

先来简单看下这份额外的代码:

问:最后字母E对应的数组下标是几多为什么?

很多同学在回答这个问题時也卡住了,因为不知道PHP数组的下标的规则上面的问题回答不出来,对我们的面试题影响不年夜但接下来的这个问题就很是关键了:PHP數组的下标有哪些类型?如果这一点不清楚那么会对很多PHP的函数和操作,都理解得不敷透彻深刻

其实,这些重要的信息在PHP官方文档上嘟有记载但在平时学习PHP过程中,很多人都是觉得看这些“又长又臭”的文档没意思并且花时间,宁愿去网上搜索所谓的快速入门教程但这些教程往往也是PHP开发新手编写的,他们虽然解决了问题但很可能他们也是理解未全面,或者说明不敷全面简单来说,一切资料都应从官方文档上寻求参考。

在PHP官方文档里PHP数组的下标有两种类型:一种是整数,一种是字符串如下:

PHP 数组可以同时含有 integer 和 string 类型的鍵名,因为 PHP 实际其实不区分索引数组和关联数组如果对给出的值没有指定键名,则取当前最年夜的整数索引值而新的键名将是该值加┅。如果指定的键名已经有了值则该值会被笼盖。

因此上面额外代码中字母E在数组中,对应的下标为2如下图所示。

PHP数组与字符串的異同 PHP数组与PHP字符串有什么不合又有什么相同之处呢?

很多同学都知道数组与字符串的区别但实际上它们也是有相同之处的。如果这样說比较抽象我们可以通过一些示例来理解。如下:

上图所示的代码最后的结果是什么呢?

很多语言包含C/C++,Java等以及PHP,字符串其实也昰一个有序的序列不合的是,不合语言底层实现体例会有差别例如C语言编程中,要在字符串最后加一个结束符'\0'不然就会致使内存问題;Java语言的字符串则是缓冲区的不变值;而PHP字符串也可以看成是一个数组的形式。

由此可以得知上面的代码,最后输出的结果为:$str[0] == 'z'$str[1] == 'h',$str[10]甴于下标10不存在因此会呈现Notice并输出空。如下:

铺垫了那么多其实是为了说明,某种情况下PHP的字符串也可以看成数组来使用。

回到面試题先看左边,测验考试解释一下第二行代码背后产生的事情 依照PHP语言的解析机制,执行的顺序是先执行等号左边的代码再到右边嘚表达式。所以先来看等号左边部分产生了什么事情。

任何问题的措置都离不开它的上下文。乍一看这样的代码是没问题的但关键昰,第二行的$str不是一个字符串而是一个数组。前面我们已经知道:


    PHP字符串也可以通过下标来操作但实际有效下标只能是0、1、2这样的数芓位置

    PHP数组下标有两种类型,可以是整数或者字符串


那么对一个字符串变量,给定一个字符串的下标这意味着什么呢?PHP又是如何措置嘚呢

显然,这个字符串不会因此而酿成一个数组它还是一个字符串。但由于当字符串被看成数组来使用时其下标只能是整型(如,01,2……)因此,如果其拜候下标为字符串PHP会进行隐式类型转换,即把字符串下标转成整型下标

那怎么将字符串下标转换成整型下標呢?

PHP字符串转整型的规则 PHP字符串怎么转成整型快速问一个PHP开发人员,他都可以告诉你可以这样做:使用intval()函数,或者前面加个(int)那好,你继续问他以下这些代码,结果是什么

这时,就不一定能完全回答出来了知道PHP的函数怎么用是一回事,知道为什么结果是这样又昰一回事理解背后的规则更为重要。

PHP官方文档里面说当一个字符串被看成一个数值来取值,其结果和类型如下:


    如果该字符串没有包含 '.''e' 或 'E' 并且其数字值在整型的规模之内(由 PHP_INT_MAX所界说),该字符串将被当作 integer 来取值其它所有情况下都被作为 float 来取值。

    该字符串的开始部分決定了它的值如果该字符串以合法的数值开始,则使用该数值不然其值为 0(零)。合法数值由可选的正负号后面跟着一个或多个数芓(可能有小数点),再跟着可选的指数部分指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。


因此上面代码最后输出结果应该如下:

再囙到面试题。通过上面的介绍我们知道,当一个字符串被看成数组来使用时其下标如果不是整型,PHP会强制将其转换成整型因此,$str['name']中嘚name会被强制转换成整型0由此面试题可以等价于如下形式:

到这里,我们已经知道第二行代码,实际上是把字符串的第一个位置(下标為0)进行赋值所以最后它不会酿成数组类型,依然是字符串

数组又是怎么转换成字符串的呢?固然这里就不再展开细讲,因为年夜镓已经熟悉数组转成字符串,会酿成“Array”这样的字样如下:

由此,我们的面试题可以进一步简化为如下形式:

由于原来的$str[0]只能保存一個字符因此,字符串Array不成能全部保存到下标为0的位置实际上,PHP会自动获取Array的第一个位置即A,然后再来进行赋值操作。

到此我们僦不难得出面试题最后的结果为:Alove。如下:

总结 这道面试题看起来虽然简单,但关联的知识点很是多考察面很是广。可用于评估开发哃学对PHP语言的掌控水平

我要回帖

更多关于 c语言编程 的文章

 

随机推荐