php适合做大量运算吗,[基础] 那些年你被多少PHP运算题带入坑了

1题

$a = 1;

$b = 0;

if($a++ > 1 || $a =0){

$b++;

}else{

$a++;

}

echo $a;

$a输出结果为1.

大家稍不注意可能认为结果是2  这道题主要考察的点是$a++与++$的区别与&&、||的段路原则。if表达式中前面的$a++ > 1显然是错的,则会执行后面的$a = 0,这是这是一个赋值语句,$a的值为0,也为假。将会执行else里面的语句。$a++之后$a的值为1.

2题

$a = 3;

if($a=5){

$a++;

}

echo $a;

$a输出结果为6.

这道题不注意的话可能回答为3或者4,答案为3的可能认为3不等于, 不会执行if语句,所以输出3;答案为4的认为执行if里面的语句进行++,所以输出4。

这道题的主要坑是$a=5是一个赋值语句,此时$a的值为5,再执行if里面的语句,所以最后输出6.

3题

$a = 3;

$b = 5;

if ($a = 3 || $b = 7) {

$a++;

$b++;

}

echo $a,$b;

这道题的答案为$a=1,$b=6.

稍不注意这道题可能会回答为4和6.$b的值为6相信大家没什么意见。这里主要考察运算符的优先级,||的优先级要高于=;所以先将运算3 || $b = 7;结果为true;if里面的表达式可以看出($a = true) $a的值为true;而bool类型的值不会进行自身的加减,所以$a最终的值为1;

4题

$a = count('567')+count(null)+count(false);

echo $a;

答案 2

如果 var 不是数组类型或者实现了 Countable 接口的对象,将返回 1,有一个例外,如果 var 是 NULL 则结果是 0。

5题:变量作用域、静态变量、先赋值后运算/先运算后赋值

$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

6题:printf返回值的问题

$i=11;

printf("%d",printf("%d",printf("%d",$i)));

结果为:1121

分析:

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

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

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

第三层打印1;

7题:当&遇到foreach

$arr = array(1,2,3);

foreach ($arr as &$val){

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

}

$val=100;

print(join(' ',$arr));

结果:33100

分析:

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

>>首先从简单的来:

$val=2;

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

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

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

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

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

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

8题 php中int的范围

print (int)pow(2,69);

结果为:0

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

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

9题 各类型变量的比较

$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

10题 浮点数的不稳定

$b = intval((0.1+0.7)*10);

echo $b;

结果为:7

分析:

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

$b = (0.1+0.7)*10;

$c = unpack('H16hex', pack('d',$b));

echo $c['hex'];

//输出:ffffffffffff1f40

转换为十进制后,为7.9999...

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

11 三目运算符优先级

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

扩展:

$x=2;

echo $x==2?'我':$x==1?'你':'它';

结果为:"你"

分析:

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

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

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

12题 include的返回值问题

//file1.php

$a = '123';

?>

//file2.php

echo include('file1.php');

?>

程序会输出什么?

结果为:1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值