ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

for文で連結リストを探索! ~ for文を再考する ~

for文というものがありますね。

今まで、配列のアクセスくらいにしか使っていませんでしたが、本当は自由度が高いんです。

最近、その自由度の高さでfor文を見なおしました。


for文は一般的に

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

と書きますが、本質的には

for(最初に実行する文; ループ抜けの条件式; 毎回実行する文)

となっています。


これは

最初に実行する文;

無限ループ {
毎回実行する文;
if(NOT ループを続ける条件式) ループ脱出;

波カッコ内に記述してある処理;
}

に等しいです。

for文はこれのシンタックスシュガーなのかな?

シンタックスシュガーだとしたら、“最初に実行する文”にて宣言した変数のスコープがループの外でも有効ですね。

じゃあ、違うのかな?
まぁ、それはいいとして。

別に数値型のカウンタ変数を用意しないといけないわけじゃありません。

for文のカッコの中は何でもいいんです。



さて、こんなに自由度が高いので、for文は連結リストの走査にも使えるということに最近、気が付きました。

C#風の言語で書くと、こうです。

for(Node node = rootNode; node != null; node = node.Next)
{
WriteLine(node.Value);
}


波カッコの中はWriteLineじゃなくても、値の検索でもいいでしょう。

こうするとシンプルに走査できて良いですね。


1つ問題を言うと、自由度はありますが、一方でVBみたいな分かりやすさはありません。

VB.NETだと、

For i As Integer = 0 To 255 '「Step 2」とかで加算する数も変更可能
Console.WriteLine(Array(i).ToString())
Next i


と書きますが、これは分かりやすいのです。


自由度を取るか、分かりやすさを取るかですね。

今回、C言語系のfor文を褒めておいて、実は私はVB.NETのFor文のほうが好きだったりします。

tag:

コメント

語弊ありますが
>for(最初に実行する文; ループ抜けの条件式; 毎回実行する文)

for(ループ前(一回だけ)実行する分; ループを続ける条件式; ループ直後(毎回)に実行する文)
かもしれないです、僕が間違っているかもしれないですが。

perl なんかだと配列を参照するときに foreach() なんてものがあります。(一応javaにもありますが下記のような機能はなく・・・)
これも結構便利で 予約変数 $_ にループ毎の配列の値を入れてくれるのです、つまりこういうことです
$i = 0;
foreach(@array)
{
true = $_ eq $array[$i];
$i++;
}

やべ、もう10:30だ、明日早いしもう寝ます。
では、おやすみなさい~。

  • 2014/02/17(月) 22:32:31 |
  • URL |
  • funcHM #-
  • [ 編集 ]

Re: funcHM

「ループ抜けの条件式」というのが変、
trueになったらループを抜けるんじゃなくて、trueの間ループを続けるのでは?
ということですよね。

その通りです。
私もそういうつもりで書いたのですが、伝わりにくかったみたいですね~。

プログラムで書いたほうが伝わりやすいということがありますからね。
数学も然り。


Perlについての話もありますが、すみません、Perlのプログラムは構造が全く分からないです…。

Javaでもなんでも、foreachはコレクションの中身を1つずつ変数に入れていくものだと思いますが、
Perlのforeachは他にない特徴があるのかな?

なにせ提示されたプログラムが私には解読できないもので…。

なるほど、盲点でした。
プログラミングを始めた頃から、for(a;b;c)のaは整数値の変数を用意している、っていう先入観ができあがってしまってましたからね~

bをtrueにして、aで変数宣言、cでインクリメントっていうふうにすれば、while文よりも見やすい無限ループが書けるのかななんて考えてみました。

  • 2014/02/21(金) 20:58:42 |
  • URL |
  • AsaBon #-
  • [ 編集 ]

Re: AsaBon

先入観ありますよね~。私もそう思っていました。

AsaBonさんが書かれた無限ループはいつかオーバーフローすると思いますよ。
私は for( ; ; ) で無限ループをしています。
C言語もそうですが、中を空っぽにすれば無限ループになるようですね。

while(true) でもいいんですが、C言語の時代にfor( ; ; )が推奨されていたようです。
(for(;;)は値が一切無いのに対し、while(1), while(TRUE)は値を使うため環境依存がどうこうで嫌われていたのかもしれません。まぁC#はどの環境でもtrueがあるのでいいんですが)

コメントの投稿

トラックバック

トラックバック URL
http://cyberboy6.blog.fc2.com/tb.php/325-f90b1eca
この記事にトラックバックする(FC2ブログユーザー)

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。