Help us understand the problem. What is going on with this article?

リストのインデックスを飛ばした場合の各 LL 言語の挙動の違い

More than 3 years have passed since last update.

「だから何」という話ではあるんだけども、各言語で挙動が違っておもしろいなぁ、と思ったので。

JavaScript

var arr = [];
arr[100] = 'foo';
console.log(arr.length); //=> 101
console.log(arr[0]); //=> undefined
console.log(arr[101]); //=> undefined

未定義のインデックスは undefined を返す。

"use strict"; を宣言しても実行結果は変わらない。

Perl

my @arr;
$arr[100] = 'foo';
print $#arr; #=> 100
print defined $arr[0] ? 1 : 0; #=> 0
print defined $arr[101] ? 1 : 0; #=> 0

JavaScript と同じく、未定義のインデックスは undef になるっぽい。

use strict; を宣言しても実行結果は変わらない。

Ruby

arr = []
arr[100] = 'foo'
p arr.size #=> 101
p arr[0] #=> nil
p arr[101] #=> nil

JavaScript / Perl とだいたい同じだが nil になる。
undefined 相当のものが無いからだと思われる。

PHP

$arr = array();
$arr[100] = 'foo';
echo count($arr); //=> 1
echo is_null($arr[0]); //=> 1
echo is_null($arr[101]); //=> 1

未定義のインデックスは null になる。

配列の長さは 1 になるのが他の言語とは違う。
PHP はリストもハッシュ(ディクショナリ)も array なのでこうなるのだと思われる。

[追記]

未定義のインデックスへのアクセスは E_NOTICE レベルのエラーが発生するとのこと。(詳細はコメント欄を参照)

error_reporting(E_ALL); // E_NOTICE を出力するように設定

$arr = array();
$arr[100] = 'foo';
echo $arr[0]; //=> Notice: Undefined offset: 0

Python

arr = []
arr[100] = 'foo' #=> IndexError: list assignment index out of range

存在しないインデックスに対して参照/代入しようとすると IndexError になる。
これが一番素直な挙動な気がしなくもない。

hoto17296
ソフトウェアエンジニアです
churadata
沖縄で データ分析 / 機械学習 / Deep Learning をやっている会社です
https://churadata.okinawa/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away