「C言語/制御文」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎基本: C23で fallthrough attribute が追加されそうなので、「2022年10月時点のC言語」
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎発展的な話題: 直接構造体の配列を初期化すればよいし、いまは初期化リスト中で [2] = (struct product_list){ "野菜ジュース", 190 } の様に順位を指定した初期化も出来る。
タグ: 2017年版ソースエディター
423 行
}
</syntaxhighlight>
 
==== 発展的な話題 ====
for文などとswtich文とを組み合わせて、配列の順位ごとの初期化する例。番号ごとに代入できます。
 
;[https://paiza.io/projects/p6-CS51SWQ9La0qaZlI0ig?language=c for文との組み合わせ使用例]:<syntaxhighlight lang="C">
#include <stdio.h>
 
int main(void) {
// 商品リスト
struct product_list {
char name[32]; // 商品名
int price; // 価格
};
 
struct product_list drinks[10]; // 構造体配列の宣言
 
for (int i = 0; i <= 2; i = i + 1) {
switch (i) {
case 0: drinks[i] = (struct product_list){ "牛乳", 120 }; break;
case 1: drinks[i] = (struct product_list){ "オレンジジュース", 240 }; break;
case 2: drinks[i] = (struct product_list){ "野菜ジュース", 190 }; break;
default : break;
}
}
 
for (int temp = 0; temp <= 2; temp = temp + 1) {
printf("商品『%s』の値段は%d 円\n", drinks[temp].name, drinks[temp].price);
}
}
</syntaxhighlight>
;実行例:<syntaxhighlight lang="text">
商品『牛乳』の値段は120 円
商品『オレンジジュース』の値段は240 円
商品『野菜ジュース』の値段は190 円
</syntaxhighlight>
 
上記のコードでは、構造体(こうぞうたい; ''structure'')を使っている。
{{See also|C言語/構造体}}
上記コードでは、forで0,1,2を巡回しているので、すべてのcaseが実行される事になります。
 
このようにわざわざswitch文を使って代入する事のメリットは、配列の順番を入れ替えたい場合、たとえば「野菜ジュース」と「オレンジジュース」の順番を入れ替えたい場合に、コピーペーストでコードをそのまま移動すれば終わるという長所がある。
 
いっぽう、もし配列に数字を直接入れてしまうと、たとえば
:<syntaxhighlight lang="C">
drinks[2] = (struct product_list){ "野菜ジュース", 190 };
</syntaxhighlight>
のように、配列番号2番などとコードを入れ替えてしまうと、順番を入れ替える際に、番号を書き直す手間が発生してしまう。
 
上記コード例では、個々の番号のデータを名称と価格の2種類だけのデータなので、まだ入れ替えの作業数は少ないが、もし、もっとデータ種類の多いデータを扱っている場合だと、直接代入の方式のコードだと、入れ替えの負担が膨大になってしまい、事実上は入れ替えが不可能になりかねない。
 
なので、switch文などを使って、入れ替えなどの編集しやすくする事で、長所がある<ref>構造体は第一級オブジェクトであることを利用し、複合リテラルを使った代入にリファクタリングしたので有り難みが薄れてしまいましたが、元は
:<syntaxhighlight lang="C">
case 2:
nomimono[i].kakaku = 190;
strcpy(nomimono[i].syouhinmei, "野菜ジュース");
break;
</syntaxhighlight>の様に構造体配列の要素の要素を1つ1つ埋めていたので保守性に問題が有りました。
<!--
:<syntaxhighlight lang="C">
struct product_list drinks[] = {
{ "牛乳", 120 },
{ "オレンジジュース", 240 };
{ "野菜ジュース", 190 },
};
for (int i = 0; i < sizeof drinks / sizeof drinks[0]; i++) {
/* ... */
}
</syntaxhighlight>
-->
</ref>。
 
== 繰り返し文 ==