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、A​​L、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、EL、EM、EN、EO、EP、EQ、ER、ES、ET、 EU、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、OH、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、英国、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) のみがサポートされていることに注意してください。他の文字変数をインクリメント/デクリメントしても効果はなく、元の文字列は変更されません。

それが続く理由は、リテラル値の比較 ( ) ではなく、数値比較 ( <=and AA < Z, ZA == 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」は、必要なエンドポイントよりも「1 つ高い」です

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

ASCII 文字 (範囲 AZ)​​ で構成されるすべての単語は、ZA に到達するまで <= 'Z' になります。これは、比較は文字列比較であり、文字列が並べ替えられている場合、"AA" は < "Z" であるためです。この質問の以前のバージョンに対する私の回答を参照してください

于 2013-01-22T12:54:30.597 に答える
1

おめでとうございます。PHP の多くの矛盾の 1 つを発見しました。つまり、+ 演算子と < 演算子は、文字列に対してまったく異なる働きをします。

  • 1文字の文字列を増やすと、期待どおりに機能します
  • Z結果の増加AAなど (Excel の列について考えてください)
  • 1文字の文字列を比較すると、期待どおりに機能します
  • 複数文字の文字列の比較は、辞書式に (文字ごとに) 機能します

興味深いエッジケースは次のとおりです。

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