58

数字の数字を区切るためにを使用する必要がある_場合、それを使用できない次の場合を理解できません。

数字の文字列が予想される位置

(ここのJDK7ガイドに記載されています)

いくつかの例?

4

8 に答える 8

66

「_」を使用する必要はありません。使用できます。提案に示されている例としては、クレジット カード番号、電話番号、または単にコードに区切り記号を付けることが理にかなっている番号などがあります。

「数字の文字列が期待される位置」については、数字で始まる(または終わる)はずの場所にあるだけです。下記は用例です。

この提案によれば、アンダースコアは数字の間にのみ配置できることに注意してください。通常は数字の文字列が期待される位置に、それらを単独で配置することはできません。

int x1 = _52; // これは識別子であり、数値リテラルではありません。

int x2 = 5_2; // わかった。(10 進リテラル)

int x2 = 52_; // 違法。(アンダースコアは常に数字の間になければなりません)

int x3 = 5_______2; // わかった。(10 進リテラル。)

int x4 = 0_x52; // 違法。"0x" 基数プレフィックスにアンダースコアを入れることはできません。

int x5 = 0x_52; // 違法。(アンダースコアは常に数字の間になければなりません)

int x6 = 0x5_2; // わかった。(16 進リテラル)

int x6 = 0x52_; // 違法。(アンダースコアは常に数字の間になければなりません)

int x6 = 0x_; // 違法。(アンダースコアを削除すると無効)

int x7 = 0_52; // わかった。(8 進リテラル)

int x7 = 05_2; // わかった。(8 進リテラル)

int x8 = 052_; // 違法。(アンダースコアは常に数字の間になければなりません)


資力:

于 2011-06-02T09:23:23.870 に答える
29

Javadocに書かれているように:

Java SE 7 以降では、任意の数の下線文字 (_) を数値リテラルの数字の間のどこにでも表示できます。この機能を使用すると、たとえば、数値リテラル内の数字のグループを分離できるため、コードの読みやすさが向上します。

たとえば、コードに桁数の多い数字が含まれている場合、カンマやスペースなどの句読点をセパレータとして使用するのと同様に、アンダースコア文字を使用して 3 つのグループの数字を区切ることができます。

long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi =  3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;
于 2013-07-31T06:35:21.507 に答える
6

誰かが元の投稿 (OP) の URL を殺したようです。何らかのフォーマット機能が再びそれを殺した場合に備えて、厄介な URL 全体を次に示します。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

あなたが話しているそのページからの具体的な引用は次のとおりです。

アンダースコアは数字の間にのみ配置できます。次の場所にはアンダースコアを配置できません。

  • 数字の先頭または末尾

  • 浮動小数点リテラルの小数点に隣接

  • F または L サフィックスの前

  • 数字列が期待される位置

ところで、できるだけ辛抱強くするために、3 番目の点については、次の例に示すように、D 接尾辞の前にもアンダースコアを使用できないことに注意してください。

double trouble = 123.456_D;  //fail
float myBoat = 321.123_F;  //fail
long winded = 90210_L;  //fail

私も 3 番目の点がかなり興味深いと思いました。ほとんどの場合、すべてのシナリオは最初の 3 つのポイントでカバーされているということです。では、それらが語るこの謎めいた「数字の列」は何を意味しているのでしょうか。最初の 3 つのポイントによって実際に対処されず、この不可解な 4 番目のポイントを追加せざるを得ないシナリオはどれですか?

最初は、彼らが 16 進数表記または 2 進数表記について話していると思っていました。b または x の後に数字が必要な場合は、次の例のように機能しません。

byte size = 0_b111101;  //fail
byte me = 0b_111101;  //fail
int hexed = 0_x_BABE;  //fail

それでも、技術的には最初のポイントと同じかもしれないと思います。これは、アンダースコアを数字の先頭に置くことはできないということです。しかし、確かに、2 進数または 16 進数を使用する場合、「b」または「x」の後には「数字の文字列」が必要ですよね? したがって、もし私が賭け屋だったら、2 進数/16 進数のシナリオの背後にいくらかのお金を置いたかもしれません。しかし、賭けをヘッジする可能性のある別のもっともらしいシナリオがあります。ここに行きます。

個人的には、java.lang.String について話すときは「文字列」という単語しか使用できないというルールが Java にあればいいのにと思います。「文字列」という用語が歩行者の意味を保持することを許可すると、混乱が生じます。これは完璧な例です。

ここで、4 番目のポイントで「数字の java.lang.String が期待される位置で」と言われている場合、解析する必要がある数値を表す実際の java.lang.String オブジェクトについて話しているという結論に達する可能性があります。したがって、次のコードを使用してください。

int i = Integer.parseInt("123_456");

それはコンパイルされますか?それは実行されますか?正常にコンパイルされますが、もちろん、parseInt メソッドは数値の java.lang.String を想定しており、その数値 java.lang.String の検証または解析により、実行時に次のエラーがトリガーされます。

スレッド「メイン」で例外 java.lang.NumberFormatException: 入力文字列の場合: java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) で「123_456」、java.lang.Integer.parseInt(Integer.java:492) でjava.lang.Integer.parseInt(Integer.java:527) at Tester.main(Tester.java:7)

もちろん、これは実行時エラーであり、Oracle のドキュメントでは、コンパイル時にフラグが立てられるエラーについて実際に述べているようです。しかし、これは確かに「数値の文字列」が予想されるシナリオです。

ここで、Oracle のドキュメントだけが Wiki 形式であるとしたら。中に入って、次のようなものを追加したくなるかもしれません。

アンダースコアは数字の間にのみ配置できます。次の場所にはアンダースコアを配置できません。

  • 数字の先頭または末尾

  • 浮動小数点リテラルの小数点に隣接

  • 「F」または「L」または「D」サフィックスの前 (私は「D」を追加しました)

  • 16 進数および 2 進数のマーカー「x」および「b」の前後

  • また、数値だけを期待するメソッドに java.lang.String を指定すると、バックグラウンドで使用されている解析アルゴリズムによって実行時例外がスローされることが予想されます。

ところで、私はこの話題について TheServerSide でちょっとした記事を書きました。お気軽にご覧ください。この記事は、Oracle Certified Professional、Java 7 Programmer 認定の目標を達成するように設計されていますが、アンダースコアの使用に関する規則を一般的に説明するだけの、非常に包括的で読みやすい記事です。

OCPJP 認定: アンダースコアを含む数値リテラルについて知っておくべきこと

それが役立つことを願っています。

于 2011-12-30T23:28:54.177 に答える
3

わかりませんが、これが文法です。お楽しみください。(「数字の文字列」はどこにもありません)

http://download.oracle.com/otndocs/jcp/enhancements-0.875-pr-oth-JSpec/

IntegerLiteral:
    DecimalIntegerLiteral 
    HexIntegerLiteral 
    OctalIntegerLiteral 
    BinaryIntegerLiteral 

BinaryIntegerLiteral:
    BinaryNumeral IntegerTypeSuffixopt 

BinaryNumeral:
    0 b BinaryDigits 
    0 B BinaryDigits 

DecimalNumeral:
    0 
    NonZeroDigit Digitsopt 
    NonZeroDigit Underscores Digits 

Underscores:
    _ 
    Underscores _ 

Digits:
    Digit
    Digit DigitsAndUnderscoresopt Digit

DigitsAndUnderscores:
    DigitOrUnderscore
    DigitsAndUnderscores DigitOrUnderscore

DigitOrUnderscore:
    Digit
    _

HexDigits:
    HexDigit 
    HexDigit HexDigitsAndUnderscoresopt HexDigit 

HexDigitsAndUnderscores:
    HexDigitOrUnderscore 
    HexDigitsAndUnderscores HexDigitOrUnderscore 

HexDigitOrUnderscore:
    HexDigit 
    _ 

OctalNumeral:
    0 OctalDigits 
    0 Underscores OctalDigits 

OctalDigits:
    OctalDigit 
    OctalDigit OctalDigitsAndUnderscoresopt OctalDigit 

OctalDigitsAndUnderscores:
    OctalDigitOrUnderscore 
    OctalDigitsAndUnderscores OctalDigitOrUnderscore 

OctalDigitOrUnderscore:
    OctalDigit 
    _ 

BinaryDigits:
    BinaryDigit 
    BinaryDigit BinaryDigitsAndUnderscoresopt BinaryDigit 

BinaryDigitsAndUnderscores:
    BinaryDigitOrUnderscore 
    BinaryDigitsAndUnderscores BinaryDigitOrUnderscore 

BinaryDigitOrUnderscore:
    BinaryDigit
    _ 

BinaryDigit: one of
    0 1
于 2011-06-02T12:31:06.377 に答える
2

「数字の文字列が期待される位置」とは、数字を含む文字列型の変数が期待される場所を意味し、アンダースコアを使用すると、アンダースコアが数値の一部になります。たとえば、次のコードを見てください。

int num = 999_333;    
String anum = "999_333";
System.out.println(num);   //Outputs 999333
System.out.println(anum);  //Outputs 999_333

したがって、引数の 1 つとして数字の文字列を期待するメソッドがある場合は、他の文字列として扱われるため、数字を区切るためにアンダースコアを使用しないでください。

于 2013-10-10T14:37:38.260 に答える
1

これについての私の解釈は、通常は数字の文字列が期待される位置にアンダースコアを単独で配置することはできないということです:

int x1= _; // Illegal.
于 2011-06-02T09:33:53.640 に答える
1

数字の文字列が期待される In 位置は、文字列リテラルのエスケープ シーケンスなどをカバーしていると思います。たとえば、あなたは言うことができません\u00_11

于 2012-06-26T19:24:54.537 に答える