我正在PHP中玩for-loop
和CLI
。我对递减运算符(--)有问题。下面是我的代码,
<?php
$handle = fopen("php://stdin","r");
$str = fgets($handle);
for($i=$str; $i>0; $i--){
var_dump($i);
}
对于任何大于0的数字,它都会进入无限循环。下面是的输出
john@doe:/var/www/html/rank$ php 1.php
3
string(2) "3
"
string(2) "3
"
string(2) "3
"
string(2) "3
"
string(2) "3
"
string(2) "3
"
但是,如果我显式地向int
键入cast-cli参数,它会起作用,
<?php
$handle = fopen("php://stdin","r");
$str = (int)fgets($handle);
for($i=$str; $i>0; $i--){
var_dump($i);
}
输出
john@doe:/var/www/html/rank$ php 1.php
3
int(3)
int(2)
int(1)
john@doe:/var/www/html/rank$
我是不是做错了什么,或者类型杂耍(故意)不适用于递减运算符?因为它似乎可以与下面的增量运算符(++)一起工作
<?php
$handle = fopen("php://stdin","r");
$str = fgets($handle);
for($i="1"; $i<=$str; $i++){
var_dump($i);
}
输出
john@doe:/var/www/html/rank$ php 1.php
3
string(1) "1"
int(2)
int(3)
john@doe:/var/www/html/rank$
您从文件获得的$str
中有一个换行符
string(2) "3
"
因此,字符串的ascii字符是#51
(字符"3"的dec.ascii代码)和#10
(换行的dec.AASCII代码)。如果使用递减运算符i--
,则字符串将变为#51#09
。下一次迭代将其更改为#51#08
。
第一个字符将不会更改,因为第二个字符将递减。这就是为什么看起来没有颁布法令的原因。
解决方案:
如果您更改
$str = fgets($handle);
至
$str = trim(fgets($handle));
换行符、制表符等将被移除以使得递减运算符将递减字符CCD_ 10。