编程:从入门到放弃
    前言
    语言和环境
    +=
    C和C++
    Hex
    Map
    Scope(1):"这"是啥
    Scope(2)
    Singleton
    什么顺序
    从A到Z
    函数
    切分字符串
    初始化(1)
    初始化(2)
    单引号,还是双引号
    参数传递
    左,还是右
    引用
    时间(1)
    时间(2)
    时间(3)
    时间(4)
    时间(5)
    比大小
    流氓甘地
    相等,还是不等(1)
    相等,还是不等(2)
    相等,还是不等(3)
    相等,还是不等(4)
    第一个说了算,还是最后一个
    语言和环境
    除以0
    随机数

从A到Z

Updated: 2021-12-12

入门。

学习编程学到循环就开始有趣了,终于发现有些事情,程序比手工更有效率,比如打印出来 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) {
  // ...
}