1.模除

题目:

<?php
echo -10%3;
*结果*

-1

分析:其实这道题的知识点是在考模除和正负号的关系,那么我们看一段进阶的代码

<?php
echo "10%3=>",10%3;
echo "<hr>";
echo "-10%3=>",-10%3;
echo "<hr>";
echo "-10%-3=>",-10%-3;
echo "<hr>";
echo "10%-3=>",10%-3;
*结果分别如下*

10%3=>1
-10%3=>-1
-10%-3=>-1
10%-3=>1

知识点总结:

一个负数mod一个正数,返回值为一个负数
一个负数mod一个负数,返回值还是一个负数
一个正数mod一个正数,返回值为一个正数
一个正数mod一个负数,返回值还是一个正数
返回值的正负取决于第一个操作数的正负!
并且结果的绝对值要小于被模数的绝对值。

2.count()

题目:

<?php
$a = count("567")+count(null)+count(false);
echo $a;
*输出结果*

2

分析:在PHP中,count()函数定义与用法如下:

  1. count() 函数返回数组中元素的数目。
  2. count(array,mode);

所以说,count()是用于计算数组的函数,但是当变量内容不为数组的时候,只有在null的情况返回值为0 ,其他情况返回值为1.

说明:所以上面这个题目,考察了变量为字符串和布尔的情况,返回值均为1,null的情况,返回值为0.所以,最终结果为1+1=2

3.运算符优先级

题目:

if($a=100 && $b=200){
var_dump($a,$b);
}
*结果*

boolean true
int 200

分析:这属于运算符优先级的短路情况。我们希望的结果是,将100赋值予$a变量,200赋值予$b变量。然而结果与我们的预期大相径庭。

那么我们看一下逻辑与和赋值运算符的优先级情况:

&& 逻辑与,=赋值运算符;

&&属于左联运算符,运算顺序从左向右;=属于右联运算符,运算顺序从右向左;

&&优先级高于=;

那么,我们现在是否应该考虑一下在我们这道题目里面究竟该如何划分优先级呢?

如果纯粹按照优先级来思考,我们得到的运算思路应当是这样的:

if($a=(100&&$b)=200)

然而,实际上,却是高优先级&&给次优先级=让步了。因为很显然,程序是这样执行的 if($a=(100&&$b=20))

这是为什么?

分析其原因的话, 是因为php并不完全遵循优先级的定义。运算符优先是在存在二义性文法时候的一种规约规则选择的手段,而php的语法分析文件定义中,却让等号和T_BOOLEAN_AND(&&)之前不存在了规约冲突。

看到这里,我突发奇想改了代码

if(!$a=false && $b=1){
var_dump($a,$b);
}

如果按照我们上面的知识点,是不是可以认为,结果应当是false 和 1?

然而,并不是,结果是这样的

 Notice: Undefined variable: b in .....\index.php on line 34
bool(false) NULL

发生了什么?为什么没有将1赋给$b?为什么$b变成了null?

答:&&前面出了false,后面的就没有被执行~ 拿砖的朋友请轻拍

这里推荐两个链接:

PHP运算符优先级的一个例外

运算符优先级

再加一道题目

$a = 3;
$b = 5;
if($a=5||$b=7){
$a++;
$b++;
}
echo $a." ".$b;
*结果*

 1 6

分析:这道题与上面不同之处在于|| 当左侧为true时直接返回,右侧不执行。

4.变量作用域、静态变量、先赋值后运算/先运算后赋值

题目:

<?php
$count = 5;
function get_count(){
static $count = 0;
return $count++;
}
++$count;
get_count();
echo get_count();
*结果*

1

这个结果得出来的很轻松,相信所有人都知道,不过,我在回答的时候还是有点忐忑不安,说明我对自己的知识点掌握的没有信心

分析:

PHP变量的4个作用域:

局部变量。函数参数。全局变量。静态变量。

显而易见,函数里面的那个是静态变量,最外层赋值为5的是局部变量。

  • 局部变量

  在函数内部声明的变量就是局部变量,它保存在内存的栈中,所以速度很快。

  局部变量很有用,因为它消除了出线意外副作用的可能性。

  • 函数参数

  参数可以按值传递,也可以按引用传递。

  任何接受参数的函数都必须在函数首部中声明这些参数。

  • 全局变量

  与局部变量相反,全局变量可以在程序的任何地方访问。

  只要在变量前面加上关键字GLOBAL,就可以将其识别为全局变量。

  • 静态变量

  函数参数在函数退出时会撤消,而静态变量则不同,静态变量在函数退出时不会丢失值,并且再次调用此函数时还能保留这个值。

关于return $count++的问题,因为变量++是先运算后赋值,所以先返回$count的值,再把$count+1

就是这么简单

5、printf返回值的问题

题目:

$i=11;
printf("%d",printf("%d",printf("%d",$i)));
*结果*

1121

结果分析:

首先,我们要知道printf的返回值是什么:它返回一个int值,表示被打印的字符数

程序从最内层printf开始,打印11,并返回11的字符数的int值,是2;

第二层printf打印2,并返回2的字符数的int值,是1;

第三层打印1;

6、当&遇到foreach

题目:

$arr = array(1,2,3);
foreach ($arr as &$val){
$val +=$val%2?$val++:$val--;
}
$val=100;
print(join(' ',$arr));
*结果*

3 3 100

分析:

我认为这里有两个知识点,一个就是标题的foreach的坑,一个就是三元运算符+运算赋值的顺序问题。

>>首先从简单的来:

$val=2;

$val +=$val%2?$val++:$val--;

上面这两行代码,得到$val的结果 应当这么理解 等号左边的是1 等号右面的是2

我的理解是,三元运算符选择执行$val--操作,但是因为是先赋值后运算,所以等号右边取得值是减一之前的 2;

而等号左边准备做加法运算,用自身加右边的值,因为刚刚右边三目运算完毕后$val已经减去了1,所以最后的结果是他本身1与右边的2相加。

>>然后,是这道题的重点:

php5之前,foreach仅能用于数组,php5之后,利用foreach还能遍历对象。

现在我们简单看一个例子

$arr = array("A","B","C","D");
foreach ($arr as $k=>&$v){
echo $v;
}
echo "<br>";
foreach ($arr as $k=>$v){
echo $v;
}
*结果*
ABCD
ABCC

分析原因。第一个循环,因为是传址操作,所以在循环执行完毕后,$v与$arr[3]指向同一地址。

并且执行第一个循环结束后,并没有对变量$v做任何操作。
在第二个循环中,又用到了这个变量$v,传值操作,然而,此时,由于上一个循环结束后没有对这个变量进行处理,所以$v与$arr[3]仍指向同一地址。
所以,在新的新循环中,遍历每一个元素,都会把$arr[$i]赋值给$arr[3];倒数第二个元素,将$arr[2]赋值给$arr[3],值是“C”,最后一个元素,是把 $arr[3]赋值给$arr[3],也就是"C"
 
好了,现在回到我们的题目,和这个有什么关系呢?

我们发现,在foreach循环结束后,程序给变量$v赋值为100,而我们知道,此时$v指向的是数组的最后一个元素,相当于把数组的最后一个元素重新赋值!那么,结果显而易见喽。

7、php中int的范围

题目:

<?php 

print (int)pow(2,69);
*结果*

0

分析:PHP整形范围是 -2^31+1 ~~ 2^31-1

上面的代码中,溢出了溢出了溢出了,所以是0喽

8、 各类型变量的比较

题目:

<?php
$arr = array(0=>1,'aa'=>2,3,4);
foreach ($arr as $key=>$val){
print($key=='aa'?5:$val);
}
*结果*

 5534

分析:

这道题的考点,在0==‘aa’

涉及到的知识点是 php的类型转换规则

1.如果是一个数字与一个字符串进行比较,那么会把字符串转换为数字再比较 (string)'aa'的结果是0;

2.字符串的转换规则,若字符串以数字开头,则取开头数字作为转换按结果,若无,则取0

推荐阅读>>0=='aa'的结果为什么是true!!!

9、浮点数的不稳定

题目:


<?php
$b = intval((0.1+0.7)*10);
echo $b;
*结果*

7

分析:

我们来看一下$b的二进制形式

<?php
$b = (0.1+0.7)*10;
$c = unpack('H16hex', pack('d',$b));
echo $c['hex'];
//输出:ffffffffffff1f40
转换为十进制后,为7.9999...

而intval向下取整,所以我们看到的是7;如果我们把intval替换为ceil的话,我们看到的是8!

推荐阅读>>$b=(0.1+0.7)*10; echo intval($b);为何输出0.7?

10、三目运算符优先级

题目:

<?php
ini_set("display_errors", 0);
$arr = array(1=>1,3=>3);
$i=2;
$a = 'test'.isset($arr[$i])?$arr[$i]:$i;
var_dump($a);
*结果*

 null

分析:

这个题,我们乍一看,以为结果会是test2

其实这个题目的知识点正是这里,.与?:的优先级问题。

在这里我们注意到,.的优先级高于?:

所以'test'.isset($arr[$i]) 永远为true。而$arr[2]不存在,所以为null

下面贴出运算符优先级给大家参考

紧接着,我们再抛出一个问题

题目:

<?php
$x=2;
echo $x==2?'我':$x==1?'你':'它';
*结果*

你

分析:

比较运算符的优先级高于三目运算符。又三目运算符的运算顺序从左到右。

所以运算的顺序可以认为是这样的(($x==2)?'我':($x==1))?'你':'它'

这样得到的结果就是'你'

11、include的返回值问题

题目:

 //file1.php
<?php
$a = '123';
?> //file2.php
<?php
echo include('file1.php');
?>
程序会输出什么?
*结果*
1

分析:

通常情况下,包含成功返回1,包含失败返回false。但是,如果被包含文件中用return返回,那么这个值就是return的值。

PHP 扒一扒这些题目都考了哪些知识点的更多相关文章

  1. js 扒一扒这些题目都考了哪些知识点

    1.空数组是true还是false 题目: <script> var tmp = 'a'; if([]==false) tmp+='b'; if(![]) tmp +='c'; alert ...

  2. linux2.6.24内核源代码分析(2)——扒一扒网络数据包在链路层的流向路径之一

    在2.6.24内核中链路层接收网络数据包出现了两种方法,第一种是传统方法,利用中断来接收网络数据包,适用于低速设备:第二种是New Api(简称NAPI)方法,利用了中断+轮询的方法来接收网络数据包, ...

  3. View绘制详解(三),扒一扒View的测量过程

    所有东西都是难者不会,会者不难,Android开发中有很多小伙伴觉得自定义View和事件分发或者Binder机制等是难点,其实不然,如果静下心来花点时间把这几个技术点都研究一遍,你会发现其实这些东西都 ...

  4. 扒一扒ReentrantLock以及AQS实现原理

    提到JAVA加锁,我们通常会想到synchronized关键字或者是Java Concurrent Util(后面简称JCU)包下面的Lock,今天就来扒一扒Lock是如何实现的,比如我们可以先提出一 ...

  5. 扒一扒.NET Core的环境配置提供程序

    很久之前,在玩Docker的时候顺便扒了扒,最近,终于下定决心花了些时间整理并成文,希望能够给大家一些帮助. 目录 .NET Core中的配置 ASP.NET Core中的配置 扒一扒环境变量提供程序 ...

  6. ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据

    ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案   ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...

  7. 扒一扒MathType不为人知的技巧

    MathType作为一款编辑数学公式的神器,很多人在使用它时只是很简单地使用了一些最基本的模板,很多功能都没有使用.MathType功能比你想象中的大很多,今天我们就来扒一扒MathType那些不为人 ...

  8. 扒一扒spring,dom4j实现模拟实现读取xml

    今天leadr提出需求,原来公司项目中读取解析xml文件的代码效率太低,考虑切换一种xml为数据封装格式与读取方式以提高效率.我这灵机一动spring对bean的依赖注入就是读取xml文件,可以尝试扒 ...

  9. ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案

    原文:ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案 ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不大 ...

随机推荐

  1. R语言学习笔记(十):零碎知识点(21-25)

    21--assign() assign函数可以通过变量名的字符串来赋值 > assign('a', 1:3) > a [1] 1 2 3 > b <- c('a') > ...

  2. oracle 数据被修改怎么修复?(闪回)

    数据被删除 或者 update 的时候忘记勾选where 限制条件,数据全部更新了?  怎么办? 要跑路了? NO !!! 看下面,迅速帮你闪回数据! demo sql: 1. SELECT * FR ...

  3. Java 基础------16进制转2进制

    我们知道,数字8用二进制表示为:1000 用16进制表示为:8 那么我给你一个16进制的数字,0x7f,他的二进制是什么呢? 一个16进制的位数,用4位表示.比如,0x 7 f 其中: 7用4位二进制 ...

  4. Hystrix入门指南

    Introduction 1.Where does the name come from? hystrix对应的中文名字是“豪猪”,豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,这与 ...

  5. node 发送 post 请求 get请求。

    因为我们部门打算用node请求restful 然后慢慢替换掉服务端,以后直接请求soa的接口,让前端的数据更贴切项目,因为我们服务端接口和app公用一套,由于业务的需求和版本不统一(例如app6.4的 ...

  6. Qt 蓝牙部分翻译

    这是我第一次尝试翻译技术文档,自己英语太烂,一直不敢尝试,感谢生活,让我勇敢迈出这第一步. 大部分都是直译,如有不妥,还请制导. Qt Bluetooth The Bluetooth API prov ...

  7. 第二篇 Fiddler配置_浏览器&手机

    什么是Fiddler? 网络项目的开发和测试中,Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的 ,可以说是非常常用的手头工具了,本文就Fiddler使用和配置进行说明. ...

  8. Hadoop伪分布式集群

    一.HDFS伪分布式环境搭建 Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有很多共同点.但同时, ...

  9. HDFS伪分布式环境搭建

    (一).HDFS shell操作 以上已经介绍了如何搭建伪分布式的Hadoop,既然环境已经搭建起来了,那要怎么去操作呢?这就是本节将要介绍的内容: HDFS自带有一些shell命令,通过这些命令我们 ...

  10. 数据结构14——AC自动机

    一.相关介绍 知识要求 字典树Trie KMP算法 AC自动机 多模式串的字符匹配算法(KMP是单模式串的字符匹配算法) 单模式串问题&多模式串问题 单模就是给你一个模式串,问你这个模式串是否 ...