--- title: 『新版 C言語によるアルゴリズムとデータ構造』のつづき author: kazu634 date: 2008-05-06 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:3985;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - C - Programming ---

 続きだよ。

新版 C言語によるアルゴリズムとデータ構造

新版 C言語によるアルゴリズムとデータ構造

for の挙動

 例題としてあげられているプログラムの読み方でちょっととまどった。

#include <stdio.h>
int main(void);
int main(void)
{
int i, n;
unsigned long counter = ;
for (n = 2;n <= 1000;n++) {
for (i = 2;i < n;i++) {
counter++;
if ( == n % i) break;
}
if (n == i) printf ("%d\n", n);
}
printf ("除算を行った回数: %lu\n", counter);
return();
}

これは

ある整数nは、2からn-1までの、いずれの整数で割り算を行っても、割り切れなければ素数です。

Amazon CAPTCHA

という発想で書かれているそうなんだけれど、

for (n = 2;n <= 1000;n++) {
for (i = 2;i < n;i++) {
counter++;
if ( == n % i) break;
}
if (n == i) printf ("%d\n", n);
}

の部分の内側のforがbreakせずに終了するときにはi++するからn=iになっていると言われて、なるへそと思ってしまった。そういえばforって、i++して条件式i < nを満たしているかを確認する命令でしたね。失礼しました(__)

配列の添え字指定をするときのインクリメントの挙動がわからない!

 さっきのを

みたいな発想で

#include <stdio.h>
int main(void);
int main(void)
{
int		i, n;
int		prime[500];
int		ptr	= ;
unsigned long	counter = ;
prime[ptr++] = 2;
prime[ptr++] = 3;
for (n = 5;n <= 1000;n +=2) {
for (i = 1;i < ptr;i++) {
counter++;
if ( == n % prime[i])
break;
}
if (ptr == i) prime[ptr++] = n;
}
for (i = ;i < ptr;i++)
printf ("%d\n", prime[i]);
printf ("除算を行った回数: %lu\n", counter);
return();
}

これなんだけど、最初の「prime[ptr++] = 2;」の挙動が分からない(..;)どうやら

int ptr = ;
prime[ptr] = 2;
ptr++;
prime[ptr] = 3;
ptr++;

しているような雰囲気なんだけど、それで果たして良いのか?が疑問。

コンマ演算子

コンマ演算子を用いたコンマ式「operation1, operation2」を評価すると、式operation1とopeation2が順に評価され、この式全体としては後で評価されたoperation2の型と値になります。

だそうです。