忍者ブログ
IT関係の小作人労働の日々の日記です。 最近データベースが好きです。 インフラ構築、DB構築、アプリケーション開発・・・何でも屋です。 何でもできそうで、何にもできない。

【C言語入門】変数の宣言と初期化:C99規格で変わった「自由な書き方」


プログラムの中で値を一時的に保存しておく「箱」が変数です。今回は基本中の基本である整数型(int)を例に、その宣言方法と、規格の進化によって効率化したポイントを解説します。

1. 実践:int型の宣言と初期化

【 動作確認 】 以下のコードを `var.c` として保存して実行します。変数 `a` に値を格納し、表示する基本的な構造です。

#include <stdio.h>

int main(void) {
    int a = 10; // 宣言と同時に初期化

    printf("aの値は %d です\n", a);

    a = 20; // 値の書き換え(代入)
    printf("書き換え後の値は %d です\n", a);

    return 0;
}

2. 規格による宣言位置の制限と緩和

【 仕組みの解説 】 C言語の規格によって、変数を宣言できる場所のルールが異なります。現代のMac環境(C11/C17)では、C99以降の緩和されたルールが適用されています。

古い規格(C89以前)
変数の宣言は、ブロック( { } )の先頭にまとめて記述しなければなりませんでした。

// C89スタイル
int main(void) {
    int a;
    int b;

    a = 10;
    b = 20;
    return 0;
}


現代の規格(C99以降)
「任意の位置」で宣言が可能になりました。これにより、ロジックの途中で必要になったタイミングで変数を定義できます。

// C99以降のスタイル(Macのデフォルト)
int main(void) {
    int a = 10;
    printf("%d\n", a);

    int b = 20; // 必要になった段階で宣言が可能
    printf("%d\n", b);
    return 0;
}

3. 未初期化変数のリスク

【 技術的注意点 】 `int a;` のように初期化を行わずに宣言した場合、その変数にはメモリ上に残っていた以前のデータ(不定値)が保持されます。これをそのまま使用すると意図しない挙動やバグの原因となるため、宣言時に明示的に初期化を行うことが推奨されます。

4. 変数の性質に応じた宣言位置の選択

現代の規格では自由な位置で宣言が可能ですが、コードの可読性を保つためには変数の役割に応じた整理が有効です。

一時的な計算用変数:使用する直前で宣言することで、変数の有効範囲(スコープ)を限定し、コードの複雑さを抑えます。
主要な制御変数:関数全体に関わる重要な変数は、あえて冒頭にまとめることで、その処理で何が中心的な役割を果たすかを明示できます。

5. 理解度チェック!練習問題

【 復習問題 】 現代のC言語(C99以降)における変数の宣言について、**正しい説明**はどれでしょうか?

選択肢:
A. 変数の宣言は必ず関数の1行目に書かなければならない。
B. `int a = 10;` のように、宣言と同時に値を代入(初期化)することができる。
C. 初期化していない変数には、自動的に「0」が代入される。
D. `int` 型の変数には、後から文字列を代入できる。

正解と解説を見る

正解:B

宣言と同時に初期化を行うのは、現代のC言語における標準的な作法です。初期化されていない変数には不定値が入るため、Bが唯一の正解となります。

6. まとめ

C99規格による制約の緩和は、C言語の記述効率を大きく向上させました。MacのClang環境では、これらのモダンな仕様をデフォルトで利用できます。変数の性質を見極め、適切な位置で宣言・初期化を行うことで、堅牢なプログラムの構築が可能になります。

PR

【データベースの知識】結合(JOIN)アルゴリズムの選択と最適化


データベースを扱う上で避けて通れないのが「テーブル結合(JOIN)」です。SQLを書けば結果は同じに見えますが、内部のアルゴリズム選択ひとつで、処理速度は100倍、1000倍と劇的に変わります。今回は実務で役立つ3つの主要アルゴリズムを解説します。

1. 主要な3つの結合アルゴリズム

【 基本 】 データベースが2つのテーブルを繋ぐ際、主に以下の3つの手法から最適なものを選択します。それぞれ「得意なデータ量」と「リソースの使い方」に明確な違いがあります。

Nested Loop Join(入れ子ループ法)
外側の表から1行ずつ取り出し、内側の表を走査して一致を探します。少量のデータに強く、インデックスの活用が前提となります。
Sort Merge Join(ソートマージ法)
両方の表を結合キーでソートし、端から順に突き合わせます。大量データに強く、不等号結合(<, >)でも利用可能です。
Hash Join(ハッシュ結合)
片方の表からメモリ上にハッシュテーブルを作り、もう片方と突き合わせます。大量データ同士の等価結合(=)において非常に強力です。

2. 特徴比較表:データ量とインデックス

【 ポイント 】 実行計画を確認する際、現在のデータ量に対して適切な方法が選ばれているかを判断する基準を持っておくことが重要です。

アルゴリズム得意なデータ量インデックス備考
Nested Loop 1件〜少量 必須 オンライン処理の基本
Sort Merge 大量データ あれば尚可 ソートのCPU負荷あり
Hash Join 大量データ 不要 メモリ(ワークエリア)を消費

3. パフォーマンス改善:DBへの介入術

通常、DBは統計情報を元に自動で判断しますが、判断を誤ることもあります。その際、エンジニアが特定のアルゴリズムを強制・誘導する方法は製品ごとに異なります。

[ 製品別の介入方法 ]
Oracle(ヒント句):/*+ USE_NL(a b) */ のように、SQL内に直接指示を書き込みます。
PostgreSQL(パラメータ):SET enable_mergejoin = off; 等で特定の機能を無効化し誘導します。
MySQL(インデックスヒント):USE INDEX を指定することで、間接的にNLJなどへ誘導します。


結合アルゴリズムの仕組みを知ることは、スロークエリの根本原因を特定し、最適なパフォーマンスを引き出す第一歩となります。


【OSS-DB Silver対策】標準で作成されるデータベース


OSS-DB Silver試験対策シリーズ、今回はデータベースクラスタを作成した際に「最初から用意されているデータベース」についてです。名前を正確に覚えることが得点に直結します。

1. 3つの事前定義データベース

【 基本 】 PostgreSQLでデータベースクラスタ(initdb)を作成すると、以下の3つのデータベースが自動的に作成されます。それぞれの役割を整理しておきましょう。

postgres:ユーザやアプリケーションが最初に接続するためのデフォルトデータベース。
template1:新しくデータベースを作成する際の「雛形」となるテンプレート。
template0:システムが使用する純粋なテンプレート。通常、ユーザはこれを変更しません。

2. 試験対策問題:4択チェック

【 問題 】 PostgreSQLのデータベースクラスタ作成時に、標準で作成される「事前定義されたデータベース」の組み合わせとして正しいものはどれですか?

問題:事前定義されているデータベース名をすべて含んでいるものを選びなさい。

1. master, temp, model

2. template0, template1, postgres

3. template, default, public

4. system, user, template1

3. 正解と解説

正解:2

【 解説 】
理解のコツ: template0 と template1 は数字が含まれる点に注意しましょう。また、接続先となるのは postgresql ではなく postgres であるという綴りの違いも試験で狙われやすいポイントです。
復習の視点: CREATE DATABASE コマンドを実行したとき、実は裏側で template1 の内容がコピーされています。そのため、template1 に共通の拡張機能などを入れておくと、新規DB作成時に自動で反映されるようになります。


4. まとめ

「template0, template1, postgres」。この3つの名前はセットで暗記してしまいましょう。一見地味な知識ですが、こうした基礎を完璧にすることが、OSS-DB Silver合格への確実なステップになります!

【Oracle復習】SELECT結果を変数に代入!SELECT INTOを使いこなす


Oracle復習シリーズ、今回はSQLとPL/SQLを繋ぐ重要なステップ「SELECT INTO」です。データベースから取得した値を変数に格納する方法を確認しましょう。

1. 文法:SELECT ・・・ INTO 変数

【 基本 】 SQLで取得したデータを変数に代入するには、`SELECT`句と`FROM`句の間に `INTO` キーワードを挟みます。これにより、クエリの結果をPL/SQL内で扱えるようになります。

[ 文法のポイント ]
INTO 変数名:取得した列の値を格納する変数。型を合わせる必要があります。
SYSDATE:Oracleの擬似列。サーバーの現在日付を取得します。
DUAL:1行だけを返す便利なダミーテーブルです。

2. サンプル:現在日付を変数に格納する

【 コード 】 変数 `myDate` を宣言し、そこに `SYSDATE` の結果を代入して出力するプログラムです。

DECLARE
  myDate DATE;
BEGIN
  SELECT SYSDATE INTO myDate FROM DUAL;
  DBMS_OUTPUT.PUT_LINE(myDate);
END;
/

3. 実行結果:日付の出力

2026/04/11 07:49:18(※実行時の現在日付)

Oracle Live SQLの「DBMS output」タブに、取得した現在日付が表示されます。

4. 解説:SELECT INTO の注意点

1. 理解のコツ: `SELECT INTO` は、必ず「1行だけ」が返ってくるクエリである必要があります。0行だったり、2行以上返ってきたりするとエラーになるため注意しましょう。
2. 復習の視点: 実務では、テーブルの列定義と同じ型を自動で適用してくれる `%TYPE`(例:`myDate emp.hiredate%TYPE;`)を併用すると、型の不一致を防げてより安全なコードになります。


5. まとめ

「データベースから値を持ってきて、変数に記憶させる」。これができれば、取得した値を使って条件分岐させたり、別のテーブルにINSERTしたりと、処理の幅がぐっと広がります。Oracle Live SQLならDUAL表ですぐに試せるのが嬉しいですね!


【Oracle復習】PL/SQLの変数宣言と代入!「HELLO WORLD」を変数で扱う


Oracle復習シリーズ、今回は「変数」の扱いです。PL/SQL特有の宣言方法や、代入演算子の書き方を確認し、文字列を変数に入れて出力してみましょう。

1. 文法:変数の定義と代入ルール

【 基本 】 PL/SQLでは、実行部の前にある `DECLARE` セクションで変数を宣言します。また、代入には `=` ではなく `:=` を使用するのが最大の特徴です。

[ 文法のポイント ]
DECLARE:変数の名前と型を定義する場所。
VARCHAR2(size):可変長文字列型。サイズ指定が必須です。
:= (代入演算子):右辺の値を左辺の変数に格納します。

2. サンプル:変数を使った出力

【 コード 】 `message` という変数を用意し、そこに文字列を格納してから出力するプログラムです。

DECLARE
  message VARCHAR2(20);
BEGIN
  message := 'HELLO WORLD';
  DBMS_OUTPUT.PUT_LINE(message);
END;
/

3. 実行結果:格納された値の表示

HELLO WORLD

Oracle Live SQLの「DBMS output」タブに、変数に格納された文字列が表示されます。

4. 解説:PL/SQLらしい書き方

1. 理解のコツ: 他の言語(CやJava)では `=` で代入することが多いですが、PL/SQL(Pascal由来)では `:=` を使います。比較演算子の `=` と区別するための伝統的な書き方です。
2. 復習の視点: 変数宣言時に `message VARCHAR2(20) := 'HELLO WORLD';` と書くことで、宣言と同時に初期化することも可能です。コードを短くしたい時に便利ですね。


5. まとめ

「箱(変数)を用意して、名前を付け、中身を入れる」。プログラミングの基本ですが、:= という記号に慣れることがPL/SQL習得の第一歩です。次は、この変数を使って計算や条件分岐に挑戦していきましょう!

        
  • 1
  • 2