C言語の複合リテラルとは?C99で導入された無名オブジェクトの生成方法を解説
C言語における複合リテラル(compound literal)は、C99規格で新たに導入された機能です。これを利用すると、名前を持たないオブジェクトを直接生成できます。通常、構造体などのオブジェクトを扱うには、あらかじめ変数を宣言しておく必要がありますが、複合リテラルを使えば宣言を省略し、その場で一時的なオブジェクトを作成して関数の引数などに渡すことが可能になります。
複合リテラルの基本構文
複合リテラルは、次のように「(型名){ 初期化子のリスト }」という形式で記述します。
(struct point) {10, 20}
この式が評価されると、指定した型のオブジェクトが生成され、波括弧内の初期化子によって各メンバーが初期化されます。
サンプルコード
以下の例では、複合リテラルを使って struct point 型の名前のないオブジェクトを生成し、display_point 関数へ直接渡しています。
#include<stdio.h>
struct point {
int x;
int y;
};
void display_point(struct point pt) {
printf("(%d,%d)\n", pt.x, pt.y);
}
main() {
display_point((struct point) {10, 20});
}
実行結果
(10,20)
コードの解説
main 関数内の (struct point) {10, 20} という部分が複合リテラルです。この式により、メンバー x に 10、メンバー y に 20 が設定された構造体オブジェクトがその場で生成されます。生成されたオブジェクトは値渡しされるため、変数名がなくても display_point 関数内で各メンバーにアクセスし、座標を出力できます。
補足:配列への応用
複合リテラルは構造体だけでなく配列にも使用できます。例えば int *p = (int[]){1, 2, 3}; のように記述すれば、配列名を持たない配列オブジェクトへのポインタを取得できます。ブロックスコープ内で生成された複合リテラルのオブジェクトは自動記憶域期間を持つため、スコープを抜けると寿命が尽きる点には注意が必要です。
-
JavaScriptのオブジェクトリテラルとコンストラクターの違いをわかりやすく解説
オブジェクトリテラルとnew Object()は同じことをしているJavaScriptでは、new Object()という記述方法と、オブジェクトリテラル({})を使う記述方法のどちらでも、まったく同じ結果が得られます。どちらも新しいオブジェクトを初期化するための構文だからです。ただし、オブジェクトにプロパティを追加していく段階になると、記述方法によってコードの見た目や扱いやすさに多少の違いが生じてきます。オブジェクトリテラルによる初期化例let a = { name: Ayush }上記の初期化は、以下のいずれかの書き方と完全に同等です。new
-
JavaScriptのタグ付きテンプレートリテラルとは?使い方を実例で解説
テンプレートリテラルには、タグ付きテンプレートリテラル(tagged template literal)と呼ばれる応用形があります。タグ付きリテラルは関数定義に似た仕組みで、テンプレートリテラルを自由に解析・加工できるのが大きな特徴です。 通常の関数呼び出しとは異なり、タグ付きリテラルでは括弧 () を使用しません。テンプレートリテラルの直前にタグ関数名を置くだけで呼び出しが行われ、タグ関数の第1引数には文字列リテラルの配列が渡されます。その後、テンプレート内の ${} で埋め込まれた式の評価結果が、残りの引数として順番に渡されていきます。 タグ関数に渡される引数の構成 第1引数:テンプレー