从A到Z

Updated: 2019-01-01

入门

学习编程学到循环就开始有趣了,终于发现有些事情,程序比手工更有效率,比如打印出来 a 到 z 的 26 个字母。用 C/C++/Java 之类的 for 循环可以这么写:

for (char c = 'a'; c <= 'z'; c++) {
  System.out.println(c);
}

坑!

直到你听说“PHP 是最好的语言“...你又写了一个 for 循环:

php > for ($c = 'a'; $c <= 'z'; $c++) { print $c."\n"; }

结果不是 26 个字符,而是……676 个……

进阶

同样的++, 不同的是,Java 里z的下一个是{

jshell> char c = 'z';
c ==> 'z'

jshell> c++

jshell> c
$3 ==> '{'

而 PHP 找到z的下一个序列,是aa……

php > $c = 'z';
php > $c++;
php > print $c;
aa

但比较字符串的时候,aa要小于z,所以循环并没有结束

php > $b = 'z';
php > $a = 'aa';
php > print strcmp($a, $b);
-25

循环直到za才会结束,所以你看到的结果是这样的:

a
b
...
y
z
aa // loop continues because 'aa' <= 'z'
ab
...
mf
mg
...
yy
yz
za // loop now terminates because 'za' > 'z'

解决方案是用这样的循环:

foreach (range('a', 'z') as $c) {
  // ...
}