2

DOS/バッチでは、

if 08 lss 1 echo true

「本当」と反響します。同じことが 09 にも当てはまります。08 と 09 は両方とも 1 未満です。

でも、

if 07 lss 1 echo true

何もエコーしません。01 から 07 は 1 未満ではありません。

なんで?08と09の特徴は?

4

3 に答える 3

5

sarnold と David Schwartz が既に提供した回答を拡張します...

IF が 8 進数または 16 進数の数値表記をサポートしていると述べているドキュメントは見たことがありません。しかし、あなたの質問により、いくつかのテストを行うようになりました。実際、SET /A がサポートするのと同じ数値表記をサポートしています。

  • 0 で始まらない数字 [0-9] のセットは、10 進数として解釈されます。
  • 0 で始まる数字 [0-7] のセットは、8 進数として解釈されます。
  • 0x または 0X で始まる数字のセット [0-9,AF,af] は、16 進数として解釈されます。

上記の 3 つの数値表記のいずれも満たさない文字セットは、文字列として扱われます。

比較の両側が有効な数値である場合、数値比較が行われます。

いずれかの側が有効な数値でない場合は、文字列の比較が行われます。

07 は 10 進値が 7 の有効な 8 進表記であり、1 未満ではありません。

08 と 09 には 0 のプレフィックスが付いていますが、有効な 8 進数表記ではないため、文字列の比較が行われます。0 で始まる文字列は、1 で始まる文字列よりも小さいものとしてソートされます。

8 進数と 16 進数の表記がサポートされていることを確認する興味深いテストがいくつかあります。

if 0xA equ 10 echo ok
if 011 equ 9 echo ok

SET /A ステートメントで無効な 8 進数または 16 進数表記を使用するとエラーが発生することは、少し興味深いことです。ただし、IF ステートメントで無効な 8 進数または 16 進数表記を使用しても、エラーは発生しません。文字列比較を強制するだけです。

アップデート

有効な数値の前に符号インジケータを付けることができます: - または +

if +0xA equ +10 echo ok
if -011 equ -9 echo ok
于 2012-05-17T01:49:48.047 に答える
1

08と09は違法です。8進数では、7が最も高い有効桁数です。ゼロの先頭の数字は、8進数として表される数値を示します。

于 2012-05-17T01:10:55.673 に答える
1

通常、先頭は、数値を8進数0で解析することを示します。私は、実際にはエラー状態になると予想します。おそらく、バッチ言語には、入力が正しくなかったことを示すための優れたメカニズムがありませんか?0809

于 2012-05-17T01:11:29.887 に答える