`

php打印乘法表水仙花数a++ ++a 的区别a++ ++a 的区别

    博客分类:
  • php
php 
阅读更多
乘法口诀表
header("Content-type:text/html;Charset=utf-8");
for($i=1;$i<10;$i++){
  for($k=1;$k<=$i;$k++){
     echo " $k * $i =".$k*$i."&nbsp";
   
  }echo "<br/>";
}
水仙花数
for($i=100;$i<1000;$i++){
$a=intval($i/100);
$b=intval($i/10);
$c=$i;
if(pow($a,3)+pow($b,3)+pow($c,3)==$i){
   echo $i."&nbsp;";
}

}
a++ ++a  的区别
++$i 没有什么好说的,就是无论什么情况,都先把$i加1 ,然后再干别的

主要说说 $i++;
所有人都知道,$i++ 是先取值,后++,但是大多数人都有一个误解,就是认为这条语句执行完毕之后,$i再加1。其实真实的情况是:变量被加1的时刻发生于$i被++之后的下一次取值

为了理解这句话,我们看几个例子:
1、
1: $i = 2;
2: echo $i++ + $i;
复制代码

结果是5

看第二行,运算中要先得到运算符两边的值之后再运算,通过加1的时刻发生于 $++ 之后的下一次取值可以得知:

a、首先计算运算符左边被加数的值,由于后++的法则是先抛值再加1,所以这时从 $i 取到的值为 2,同时把发生在 $i 身上的后++操作记录下来。这时运算符左边为 2。注意,这时 $i 还未真正的+1
b、接着取运算符右边的加数。他取 $i 的值的时候发现 $i 曾经++过,于是把 $i 加 1 的结果赋给 $i 的同时,返回被+1之后的$i,于是从第二个$i取得的值是被加1之后的值,3。这时运算符右边为3。
c、2+3=5

2、
1: $i = 2;
2: echo $i + $i++;
复制代码

还是第二行。同样要先计算两面,于是便有:
a、首先计算左边,取得$i的值为 2,这个没什么好说的。
b、计算右边,由于后++的特性是先抛值,所以加号运算符右边得到的值也是2
c、2+2,结果是4

最后看一个复杂一点的:
$a=5;
$a+=++$a+$a++;
复制代码

不要被a+=b迷惑,通过 a+=b === a=a+b 转换一下看得更清楚:
$a = ++$a + $a++ +$a;
优先级是这样的:先计算自增减表达式,再根据乘除加减这个基本顺序计算整个表达式

这样我们模拟一下电脑:
a、++$a,直接将$a+1赋值给$a,之后抛出 $a 的值,++$a 这个表达式的位置当前值就成为了 6,现在$a也是6
b、$a++。因为后++是先抛值,所以直接抛 $a 的值 6。这时 $a++ 这个位置的当前值是6。
c、$a。取$a的值的时候发现他曾经有过被++的操作,于是把 $a 加上1赋值给$a,同时抛出值7。这时 $a这个位置的当前值就变成了7
d、$a = 6+6+7,结果是19。

只要记住:当变量$i发生后++的情况时,并不进行+1运算,而是在被++之后仅仅记录++操作,下一次取$i值的时候再+1返回。

一个比较有意思的例子是hightman发出来的:
$a = 1;
$b = &$a;
$b = $a++;
echo "a: $a \nb: $b";
复制代码


你将会发现 $a 和 $b 都是 1!按照上面所说,应该是2才对啊!怎么解释呢?其实解释很简单,就是++操作丢了。听起来不可思议,其实不难理解。这里面跟++已经没有什么关系了,完全是'引用'这个东西在指使。

关于引用的话题,请参加我的另一篇帖子[关于引用的解释]:
http://bbs.chinaunix.net/viewthr ... &extra=page=1
刚才在论坛看到的..题目是这样的:

View Code
1 2
$i = 1; echo "i=".(++$i)+(++$i)+(++$i);
大家可以去运行一下 结果会是7!

这让我们很纳闷 为什么是7呢? 无论如何都出不来7啊..

下面我们改一下这道题目

View Code
1 2
$i = 1; echo (++$i)+(++$i)+(++$i);
这时候在让你回答.我觉得你是可以回答出正确答案的.

没错. 这个答案是9..我想这个我就不必解释了. 2+3+4 所以等于9

那么回到最上面的题.为什么会是7呢?


其实蒙蔽就蒙蔽在那么多自增运算符了. 我们可以去查一下手册运算符的优先级可以看到.

+ – .属于一个优先级 .也就是说PHP计算的时候需要从左向右计算.

所以PHP需要先计算 “i=”.(++$i) 这时候答案是会是 “i=2″ 注意这是字符串.

在PHP中”.“与”+“的区别是相当分明的.”.“就是字符串运算.”+“就是数字运算.

这时候的运算便成了”i=2″+(++$i)+(++$i)了 我们看到 运算中没有了点.所以PHP会去实行数字运算.

但是第一个是字符串.所以PHP会把”i=2″这个字符串强制转换成数字.由于这个字符串的第一个字符不是数字.所以强制转换后的记过就是0。如果这个字符串是”2i=2″.那么转换后就变成2了.

这时候0+3+4 所以就等于7了.

好了 总结下 这道题需要我们注意2点.

“.“与”+“的优先级的问题
字符串强制转换成数字的问题
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics