36

可能重复:
为什么这段代码不简单地打印字母 A 到 Z?

为什么当我使用以下循环结构时,我得到了正确的结果 -

for ($c = "A"; $c <= "Y"; $c++)
{
    echo $c.", ";
}

我得到的结果是——

A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,

这似乎没问题。但是当我在上面的 for 循环中替换为时,我得到了不寻常的Y结果Z

for ($c = "A"; $c <= "Z"; $c++)
{
    echo $c.", ";
}

我得到的结果是——

A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y, Z,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX, AY,AZ,BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM,BN,BO,BP,BQ,BR,BS,BT,BU,BV,BW, BX、BY、BZ、CA、CB、CC、CD、CE、CF、CG、CH、CI、CJ、CK、CL、CM、CN、CO、CP、CQ、CR、CS、CT、CU、CV、 CW,CX,CY,CZ,DA,DB,DC,DD,DE,DF,DG,DH,DI,DJ,DK,DL,DM,DN,DO,DP,DQ,DR,DS,DT,DU, DV,DW,DX,DY,DZ,EA,EB,EC,ED,EE,EF,EG,EH,EI,EJ,EK,E​​L,EM,EN,EO,EP,EQ,ER,ES,ET,欧盟,EV,EW,EX,EY,EZ,FA,FB,FC,FD,FE,FF,FG,FH,FI,FJ,FK,FL,FM,FN,FO,FP,FQ,FR,FS, FT、FU、FV、FW、FX、FY、FZ、GA、GB、GC、GD、GE、GF、GG、GH、GI、GJ、GK、GL、GM、GN、GO、GP、GQ、GR、 GS,GT,GU,GV,GW,GX,GY,GZ,HA,HB,HC,HD,HE,HF,HG,HH,HI,HJ,HK,HL,HM,HN,HO,HP,HQ,HR,HS,HT,HU,HV,HW,HX,HY,HZ,IA,IB,IC,ID,IE,IF,IG,IH,II,IJ,IK,IL, IM,IN,IO,IP,IQ,IR,IS,IT,IU,IV,IW,IX,IY,IZ,JA,JB,JC,JD,JE,JF,JG,JH,JI,JJ,JK, JL,JM,JN,JO,JP,JQ,JR,JS,JT,JU,JV,JW,JX,JY,JZ,KA,KB,KC,KD,KE,KF,KG,KH,KI,KJ, KK,KL,KM,KN,KO,KP,KQ,KR,KS,KT,KU,KV,KW,KX,KY,KZ,LA,LB,LC,LD,LE,LF,LG,LH,LI, LJ,LK,LL,LM,LN,LO,LP,LQ,LR,LS,LT,LU,LV,LW,LX,LY,LZ,MA,MB,MC,MD,ME,MF,MG,MH, MI,MJ,MK,ML,MM,MN,MO,MP,MQ,MR,MS,MT,MU,MV,MW,MX,MY,MZ,NA,NB,NC,ND,NE,NF,NG, NH,NI,NJ,NK,NL,NM,NN,NO,NP,NQ,NR,NS,NT,NU,NV,NW,NX,NY,NZ,OA,OB,OC,OD,OE,OF, OG,哦,OI,OJ,OK,OL,OM,ON,OO,OP,OQ,OR,OS,OT,OU,OV,OW,OX,OY,OZ,PA,PB,PC,PD,PE, PF,PG,PH,PI,PJ,PK,PL,PM,PN,PO,PP,PQ​​,PR,PS,PT,PU、PV、PW、PX、PY、PZ、QA、QB、QC、QD、QE、QF、QG、QH、QI、QJ、QK、QL、QM、QN、QO、QP、QQ、QR、QS、 QT,QU,QV,QW,QX,QY,QZ,RA,RB,RC,RD,RE,RF,RG,RH,RI,RJ,RK,RL,RM,RN,RO,RP,RQ,RR, RS,RT,RU,RV,RW,RX,RY,RZ,SA,SB,SC,SD,SE,SF,SG,SH,SI,SJ,SK,SL,SM,SN,SO,SP,SQ, SR,SS,ST,SU,SV,SW,SX,SY,SZ,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP, TQ,TR,TS,TT,TU,TV,TW,TX,TY,TZ,UA,UB,UC,UD,UE,UF,UG,UH,UI,UJ,UK,UL,UM,UN,UO, UP,UQ,UR,US,UT,UU,UV,UW,UX,UY,UZ,VA,VB,VC,VD,VE,VF,VG,VH,VI,VJ,VK,VL,VM,VN, VO,VP,VQ,VR,VS,VT,VU,VV,VW,VX,VY,VZ,WA,WB,WC,WD,WE,WF,WG,WH,WI,WJ,WK,WL,WM, WN,WO,WP,WQ,WR,WS,WT,WU,WV,WW,WX,WY,WZ,XA,XB,XC,XD,XE,XF,XG,XH,XI,XJ,XK,XL, XM, XN, XO, XP, XQ, XR, XS, XT, XU, XV, XW, XX, XY, XZ, YA,YB,YC,YD,YE,YF,YG,YH,YI,YJ,YK,YL,YM,YN,YO,YP,YQ,YR,YS,YT,YU,YV,YW,YX,YY,YZ,

这种行为有什么原因吗?

4

3 回答 3

25

直接来自PHP 手册

PHP 在处理字符变量而不是 C 的算术运算时遵循 Perl 的约定。例如,在 PHP 和 Perl 中 $a = 'Z'; $a++; 将 $a 变成 'AA',而在 C 中 a = 'Z'; 一个++;将 a 转换为 '['('Z' 的 ASCII 值是 90,'[' 的 ASCII 值是 91)。请注意,字符变量可以递增但不能递减,即使如此,也仅支持纯 ASCII 字符(az 和 AZ)。增加/减少其他字符变量没有效果,原字符串不变。

它继续运行的原因是因为您正在尝试进行数值比较(<=AA < ZZA == Z(在执行时<=))而不是文字值比较(==)。

鉴于此,您可以使用以下代码:

for ($c = "A"; $c != "Z"; $c++)
{
    echo $c . ", ";
}

..或使用字符的实际序数值(我认为这是更好的解决方案):

for ($c = ord("A"); $c <= ord("Z"); $c++)
{
    echo chr($c) . ", ";
}
于 2013-01-22T12:49:30.343 回答
5

递增字符时不要使用 < 或 >(或 >= 或 <=)进行比较,使用 !==

for ($c = "A"; $c !== "AA"; $c++)
{
    echo $c.", ";
}

其中“AA”比您想要的端点“高一个”

$lastCharacter = 'Z';
$lastCharacter++;
for ($c = "A"; $c !== $lastCharacter; $c++)
{
    echo $c.", ";
}

在到达 ZA 之前,所有由 ASCII 字符(范围 AZ)组成的单词都将是 <= 'Z',因为比较是字符串比较,如果字符串已排序,则“AA”是 <“Z”。请参阅我对这个问题的先前版本的回答

于 2013-01-22T12:54:30.597 回答
1

恭喜,您发现了 PHP 中的许多不一致之处之一。简而言之:+ 和 < 运算符在字符串上的工作方式完全不同。

  • 增加一个单字母字符串的工作方式与您期望的一样
  • 增加Z结果AA等等(想想 Excel 列)
  • 比较单字母字符串的工作方式与您期望的一样
  • 比较多字母字符串按字典顺序工作(逐个字母)

现在有趣的边缘情况是:

'Z' <= 'Z'    // because equal
'Z'++ == 'AA' // because magic
'AA' <= 'Z'   // because A comes before Z
于 2013-01-22T12:58:16.957 回答