question2024
@question2024 (step1engineer)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

java silver 起動パラメーターの指定

質問したいことは

java silver 11 の学習をしています。
起動パラメーターに関する問題で、解説を読んでもわからないところを質問させていただきます。

問題

(実行コマンド)
> java Sample a ¥" a¥" "a "b c
1. public class Sample {
2.   public static void main(String... args){
3.      System.out.println(args.length);
4.   }
5. }
問題
Sampleクラスを実行した結果は?

選択肢
A. 4が表示される
B. 5が表示される
C. 6が表示される
D. 7が表示される

解答
B(5が表示される)

どこが分からないのか

(表示が5と分かったうえで)分解してみる。
① a →単純に文字
② " →エスケープされたダブルクォーテーション
③ a" →文字とエスケープされたダブルクォーテーション
④ ここがわからない
⑤ c →前の文字bとの間にスペースがあるのでbの次の文字がくる

解説によると

④の部分が「a b」になるということです。
「4つ目のダブルクォーテーションが「a 」というスペースを含む文字列と「b」という文字列が連結されて1つの文字列になっている」と説明がありました。

自分はどう考えているか

起動パラメータの
"a "b
の部分ですが、

● aの前のダブルクォーテーションはエスケープしていないので
 データとして扱われない
● 「a "b」の部分は、bの前のダブルクォーテーションは
 エスケープされていないからデータとして扱われない
● 「a b」と同じ意味になる?から、
a
b
とここで一回区切りが入ってしまう
でもそうすると表示は6になるので違う、、、
なぜ④の部分が「a b」で空白を含む1つの文字列になるのだろう。。。

以下のことは理解しているつもりです

・スペースで区切って列挙する
・スペースを含む文字列を渡すにはダブルクォーテーションで括る
・ダブルクォーテーションを文字として使うには「¥"」とする
・ダブルクォーテーションはエスケープしない限りデータとして扱われない

教えてくださいm(_ _)m

解説文をみて、なるほど!となれません。
段階を踏んで教えてくださる方がいましたらサポートを
お願いしたいです。
よろしくお願いいたします。

0

1Answer

"a "b の部分は Java ではなくシェルが解釈します。シェルでは「シングルクォートまたはダブルクォートされた文字列」と「クォートされておらず、スペースや特殊文字も含まない文字列」を(任意の順番で、任意の個数、間にスペースを空けずに)並べて書くとすべて1つの文字列に連結されます。

つまり、"a "b は「a、スペース1個」と「b」を連結した1つの文字列になります。普通は "a b" と書きますが。また a" "ba" b""a"" ""b" などと書いても同じ文字列になります。

1個の文字列は、その中にスペースを含んでいようと、 String... args に1個の要素として格納されます。

1Like

Comments

  1. @question2024

    Questioner

    uashi さま

    コメントありがとうございます!

    シェルでは「シングルクォートまたはダブルクォートされた文字列」と「クォートされておらず、スペースや特殊文字も含まない文字列」を(任意の順番で、任意の個数、間にスペースを空けずに)並べて書くとすべて1つの文字列に連結されます。

    ↑の内容、初めて知りました。m(_ _)m
    ご丁寧な解説助かりました。
    躓いていた問題も納得して解けました。
    ありがとうございます。!!

Your answer might help someone💌