No.2ベストアンサー
- 回答日時:
30年ほど基本ソフトの開発や応用システムの開発をしていまいたが。
。。> いかにも初心者っぽいので 、< 記号を使うのが現場では常識と言っていました。
「これこれしかじかで、≦を使うとこういう誤りを起こす可能性があるから、こういう場合には<を使うようにしなさい」との説明があかったのでしたらそれに従うのがよいですが、ご質問に書かれている説明だけなのでしたらソフトウェア開発に関して大したスキルを持っている人ではないでしょう。恐らくその意味するところ、本質を理解していない。。。
初心者っぽいということは「誰にでも分かりやすい」ということだと私は思います。
ソフトウェアは一度作ると形を変えながら長く生き延びます。最初に作ったシステムは無くなってしまっても、その中にあった機能は次の世代のシステムの中にそのまま持ち込まれることもあります。あたなが別の部署へ行っても、別の会社へ行ったとしても今作ったシステムは使われ続けます。
つまりあなたがいなくなても誰かが面倒を見るのです。ですから設計書やコーディングは分かりやすさが大切です。
こうやった方が機械語に落ちた際の命令数が少ないとかいったことはもうずいぶん前からコンパイラの最適化機能がかなり頑張ってやってくれます。高速のCPUがカバーしてくれます。ぎりぎりめいっぱいシビアな分野のリアルタイム処理や、ほんのわずかな高速化が大きな処理時間短縮につながる大規模シミュレーションのようなプログラムでも限り「人の分かりやすさ」「可読性」を犠牲にしてまで凝る必要はありません。
なので、、、
> いかにも初心者っぽいので 、< 記号を使うのが現場では常識と言っていました。
などと言ったお遊び事を言っている人間のいう事は重要ではありません。
それよりも「for( int i = 0 ; i ≦ 4 ; i++)」が「for( int i = 0 ; i < 5 ; i++)」よりこの部分の処理の意味合いを誤解無く示すのであれば「for( int i = 0 ; i ≦ 4 ; i++)」とするのが適当です。
そこでその人が言う所の初心者っぽく見せないために「for( int i = 0 ; i < 5 ; i++)」と書いた時、「なぜ5なの?」「5は何処から来たの?」となるようでは本末転倒。プロとしての配慮が無い自己満足だけのコーディングだと言えます。
逆に今の「for( int i = 0 ; i ≦ 4 ; i++)」がそうなら意味の分かりやすい形に直すのが適当です。それが「for( int i = 0 ; i < 5 ; i++)」なのか、「for( int i = 1 ; i ≦ 5 ; i++)」なのかは仕様によるのでわかりません。
ちなみにこのforループの初期値と繰返し条件のところの分かりやすさの問題はJavaに限りません。
配列の位置情報としてカウンターは0から使いたい。でも繰返し条件は回数とか配列の個数とかであることが直観的で分かりやすい。。。
経験的にはfor文の初期値、繰返し条件に使用する変数名はそこに格納される値が位置なのか個数・回数なのかが分かるようにすることが重要と思います。
C言語系では昔から i、jを(リッチー&カーニハンの教科書がそうだったので)常用していますが、Javaはそれに付き合う必要はないと思います。もっと自由に分かりやすく書けばよいと思います。もちろん、その際にソース上に加筆するコメントも重要です。
>>経験的にはfor文の初期値、繰返し条件に使用する変数名はそこに格納される値が位置なのか個数・回数なのかが分かるようにすることが重要と思います。
そうなのですね、これから意識して使用をするようにします。
実際動画では、配列の話をしていて、その回数分だけ回すのに使用をしていました。
No.4
- 回答日時:
「境界法」という、インデックスを使ってデータの
範囲を表す方法があって、例えば配列 a のデータの「部分」を
指定する場合
beginIndex = 1, endIndex=4 は
a[1], a[2], a[3] を表します。
つまり、
beginIndex <=配列のインデックス<endIndex
が、beginIndex , endIndex で示された範囲です。
a[0], a[1], a[2], a[3] なら beginIndex = 0, endIndex=4
なぜ、こんな書き方をするかというと
(1) endIndex - startIndex = 範囲の中のデータの個数。
(2) endIndex = startIndex で空のデータ範囲を表せる。
となかなか美しい性質があるからです。Cでは伝統的に
この書き方が使われてきたので、Javaにも受け継がれていますね。
「境界法」とは配列を
a[0], a[1], a[2], a[3], a[4] と並べた場合、
startIndex = 1 とは, a[0]とa[1]の間(境目)にある範囲の開始点
endIndex = 3 とは、a[2]とa[3]の間(境目)にある範囲の終了点
というように、インデックスが配列要素間の境目を指すと考える
範囲の表現方法です。
#エディタのアイビームカーソルのようなものです。
APIの中でも、String#substrの文字列の範囲の指定の仕方とか、
随所でこの範囲の指定法が使われています。
もちろん、beginIndex <=配列のインデックス<=endIndex
として、空の範囲は、beginIndex >endIndex と表しても
よいのですが、ちょっと美しくないのと、異なる1だけずれた考え方を
混在させるのは混乱のもとになるのです。統一するべきでしょう。
というわけで、たいていの人は「境界法」の考え方で
ループを回すことが多いです。
No.3
- 回答日時:
まず。
そもそも「≦」は使えません。
「以下」を意味する演算子は 「<=」です。
> いかにも初心者っぽいので 、< 記号を使うのが現場では常識
ただこう説明していたのなら、正直よくない説明だと思います。
ループの内容によって使いわけるべきものです。
例えば、forループがよく使われる場面に、配列の全要素について処理する、というのがあります。
長さlengthの配列は 0〜 length-1 の添字を持ちます。
このことから、次のような書き方になります。
for(int i=0; i < a.length ; i++ )
for(int i=0; i <= a.length -1 ; i++ )
この場合、慣れの問題もありますが、
・前者には「配列全体」だという意図を感じることができます。
・後者は、文字数も増えているし、 -1 に何か意図があるのでは、と一瞬考えてしまいます。
となります。
これが「最後から一つ前まで」となると
for(int i=0; i < a.length-1 ; i++ )
for(int i=0; i <= a.length -2; i++ )
for(int i=0; i <= a.length -1-1 ; i++ )
となって
・1番目の -1 は、「最後から一つ前」の意図を感じる
・2番目の -2 は、一瞬、何を意味しているか分からない
・3番目の -1 は、「最後から一つ前」の意図は感じるが、-1-1となるのが冗長
となります。
このような「0から始まるループ」はプログラムでよく出てくるので、「 <= 」よりは「<」 の方がループの意図がわかりやすくなることが多く、「現場」でもよく見かけることになります。
ですが、これが「a≦n≦bの整数を足す」みたいなものだと
for(int n=a; n <= b ; n++ )
と書いた方が圧倒的にわかりやすいです。
for(int n=a; n < b+1 ; n++ )
と、無理に < を使ったり
for(int i=0; i <= b-a ; i++ ) { int n=a+i ;
for(int i=0; i < b-a +1 ; i++ ) { int n=a+i ;
と、無理に「回数」にしたりすると、よくわからなくなります。
ご回答有り難うございます。
>for(int i=0; i < a.length ; i++ )
>for(int i=0; i <= a.length -1 ; i++ )
確かに上の例のほうが、ぱっと見で配列の個数分だけループを回しているだなとわかりやすいですね。
可読性については、全然経験不足なのですが、意識して作るようにします。
No.1
- 回答日時:
for文のiなどのループ変数が0始まりだから。
例えば変数xがあって3が代入されていたとすると、
for( int i = 0 ; i ≦ x ; i++ とすると4回実行される。
実際にはDBから取り込んでXに代入した値を処理回数にする事の方が多い。つまりこの場合には3回処理したい。
for( int i = 0 ; i ≦ 4 ; i++)と書くと4は4回と言う意味ではなくなってしまう。
非常に紛らわしい。0始まりである弊害。
これを解り易くする為、現場では< 記号を使う。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- Java Java 配列<選挙> 4 2023/07/31 15:07
- 発達障害・ダウン症・自閉症 WAISⅲについて 全検査 99 言語理解 88 知覚統合 110 作動記憶 92 処理速度 86 1 2022/11/22 10:18
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- 英語 be sorry for doingとbe sorry to have doneの意味の違いについて 2 2023/06/09 13:57
- Visual Basic(VBA) ユーザーフォームの表示を追加したい 2 2023/03/26 23:18
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[Ljava.lang.Stringってなんですか
-
配列で、値の入っている要素数...
-
main(String[] args) の args...
-
C#で動的配列Listの中身をListB...
-
Javaには、構造体はないんですか?
-
javaでEUC-JP文字列→UTF-8への変換
-
出力ストリームをバイト配列へ...
-
Java配列の問題を教えてくださ...
-
java
-
csvファイルを2次元配列に格納
-
エラーのStackTraceをString変...
-
『args[]』とは?
-
【C#】ハッシュテーブル(連想...
-
動的配列確保
-
Javaで文字と数字が混ざったも...
-
jspでの二次元配列
-
配列のサイズをrealloc的に変更...
-
cloneメソッドについて (java)
-
データベースから取得したデー...
-
Java CSVファイルをカンマごと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ページング
-
[Ljava.lang.Stringってなんですか
-
【C#】ハッシュテーブル(連想...
-
配列で、値の入っている要素数...
-
C言語でunsigned char配列を連...
-
Javaで文字と数字が混ざったも...
-
この警告はどうすれば?
-
C#で動的配列Listの中身をListB...
-
配列の中に複数存在する数がい...
-
javamailで複数人にメールを送...
-
同じ配列またはクラスを、2回...
-
csvファイルを2次元配列に格納
-
ArrayListからBean配列に値をセ...
-
javaで大容量テキストファイル...
-
main(String[] args) の args...
-
【Ajax通信&Java】配列の受け取...
-
java
-
『args[]』とは?
-
配列をセッションに割り当てた後で
-
Javaで文字を漢字であるか否か...
おすすめ情報
皆様、ご回答有り難うございます。
どの方も、相当の経験を積んでおられるようで、勉強になりました。
ベストアンサーが1名しか選べないのが、心苦しいですが、今後もどうぞよろしくお願いいたします。