2

つまり

for (int i=1; i<7; i++) 

純粋に反復回数の場合は、はるかに読みやすくなります。

for (int i=0; i<6; i++)

しかし、やや他のアプローチが標準になっています。

どう思いますか?それは悪い習慣ですか、それとも落胆しますか?

4

4 に答える 4

5

配列はほとんどの場合 0 から始まるため、デザイナーがコレクションを持つ他の非配列オブジェクトを作成する場合、それらも 0 から始まる傾向があると思います。0 ベースは単なる標準であるため、これに固執することは、一貫性とメンテナーの使いやすさだけです。

また、私には、

for(int i = 0; i < 6; i++) {

1 つのループが完了すると、カウント ( i) が 1 になることがわかっているため、より読みやすくなっています。1 から始まる、最初のループの後、カウントはi = 2です。これは私を少し失望させます。

于 2012-06-01T15:47:30.010 に答える
2

大会。ゼロ インデックスは非常に広く普及しており、歴史的にも一般的であるため、特別な理由がない限り、プログラマーはゼロ インデックスを目にすることを期待しています。インデックスが 1 から始まるループを見た場合、通常は「ああ、そのほうが読みやすい」とは思わず、「なぜここで 1 から開始するのかを理解した方がよい」と考えます。

于 2012-06-01T15:50:14.213 に答える
1

私はそれを主張します

for (int i=1; i<7; i++) 

より読みにくい

for (int i=0; i<6; i++)

それは6反復だからです。最初のループを見てそれを理解するには1、から減算する必要があります。7

2つのオプションは通常、条件として開始して0使用する<か、次のように条件として開始し1て使用<=します。

for (int i=1; i<=6; i++)

一部の言語(MATLABなど)は、1から始まるすべてのインデックスを作成することに注意してください。

通常起こることは、言語のすべてのループが、最も基本的で広く使用されている自然に索引付けされた構造の索引付け規則に従うことです。Javaでは、配列はでインデックスが付けられます0。0ベースのインデックスから1ベースのインデックスに切り替えて元に戻すのは面倒なので、すべてが0インデックスになります。

比較のために、MATLABでは、配列と行列は1インデックスであるため、すべてのループも通常1インデックスです。

于 2012-06-01T15:58:49.583 に答える
0

それは c ポインターの時代にさかのぼります (私の c はさびているので許してください)。以下は、c での配列宣言です。

int arr[10] = { ... };

実際には、「arr」変数は実際には「int *」型です (ただし、上記のように宣言すると、コンパイラは、malloc を使用した int * とは対照的に、範囲外になったときに自動クリーンアップを強制できます)。 10 個の int 値に十分な連続スペースがあるメモリ ロケーション。次に、配列にアクセスします。

int element = arr[index];

アクセスで実際に起こっていることは次のとおりです。

int element = * (arr + index*sizeof(int));

ポインターを取得し、関心のある要素のメモリ位置 (括弧内の部分) を指すポインターに十分なバイトを追加し、それを逆参照して値 (*) を取得します。

したがって、配列の最初の要素のインデックスは 0 です。これは、ポインターが既に最初の要素を指しているためです。そのため、メモリの場所には何も追加しません。

インデックスは、「必要なものを見つけるためにポインターに追加する必要があるスロットの数」と考えてください。

于 2012-06-01T17:44:14.440 に答える