4

以下に示すような小さなコードがあります

public class Testing {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String firstString = sc.next();
        System.out.println("First String : " + firstString);
        String secondString = "text\\";
        System.out.println("Second String : " + secondString);
    }
}

入力をテキスト\\として提供すると、出力が次のようになります

First String : text\\
Second String : text\

最初の文字列に提供する入力が 2 番目の文字列と同じであるのに、なぜ 2 つの異なる文字列を取得するのですか。

www.ideone.com でのデモ

4

4 に答える 4

11

実行時に入力として提供するコンソールの二重バックスラッシュは、実際には 2 つのバックスラッシュです。ASCII 文字のバックスラッシュを 2 回書いただけです。

文字列リテラル内の 2 つのバックスラッシュは、1 つのバックスラッシュのみを意味します。文字列リテラルに単一のバックスラッシュを書き込むことはできないためです。なんで?バックスラッシュは、特殊文字を「エスケープ」するために使用される特殊文字であるためです。例: タブ、改行、バックスラッシュ、二重引用符。ご覧のとおり、バックスラッシュもエスケープする必要がある文字の 1 つです。どうやって逃げるの?バックスラッシュ付き。したがって、バックスラッシュをエスケープするには、バックスラッシュの後ろに置きます。したがって、これは 2 つのバックスラッシュになります。これは単一のバックスラッシュにコンパイルされます。

なぜ文字をエスケープする必要があるのですか? この文字列を見てください: this "is" a string. これを Java で文字列リテラルとして書きたい場合は、意図的に次のようになると思うかもしれません。

String str = "this "is" a string";

ご覧のとおり、これはコンパイルされません。したがって、次のようにエスケープします。

String str = "this \"is\" a string";

現在、コンパイラは"、文字列を閉じていないことを認識していますが、実際には文字"を意味します。これは、バックスラッシュでエスケープしたためです。

于 2012-07-15T15:07:57.113 に答える
2

Java は\を 2 番目の文字列でエスケープ文字として使用します

オンデマンドで編集

  • 最初のケースでは、入力は入力されたすべての文字を受け取り、文字列にカプセル化するため、すべての文字が出力されます (評価されず、読み取られたときに出力されます)。

  • 2 番目のコードでは、JVM は の間の文字列を 1 文字ずつ評価し、1 番目のコードには 2 番目の"コード\を保護するメタ文字があるため、出力されません。

于 2012-07-15T15:09:03.810 に答える
2

Strings\では特殊文字です。たとえば、\n改行記号を作成するために使用できます。その特別な意味を無効にするには、別の\likeを使用する必要があります\\。したがって、2番目のケースでは1文字\\として解釈されます。\

外部ソース (ストリームなど) から文字列を読み取る場合、特殊文字は既にタブレータや改行文字などに変換されているため、Java はそれらが通常の文字であると想定します。

于 2012-07-15T15:18:06.857 に答える
0

バックスラッシュには特別な意味があるため、文字列内部の char のシーケンスを二重引用符間の char のシーケンスと混同しないでください: "\n\r\t\\\0" => { (char)10,(char)13, (文字)9,'\\',(文字)0 }

于 2012-07-15T15:14:26.410 に答える