C言語のcontinue文の飛ぶ先
auです。
前回はbreak文の飛ぶ先について書きました。
今回はcotinue文の飛ぶ先について書きたいと思います。
continue文の飛ぶ先
cotinue文はfor文やwhile文のループの中でよく見かけます。continue文が処理されると、それ以下のループの内容は処理せずに、ループの最初の文まで戻ります。
#include <stdio.h> int main(void) { for (int i = 0; i < 10; i++) { // continueの処理でここにくる printf("%d回目\n", i); if (i % 2 == 0) { printf("%dは偶数です\n", i); continue; } else if (i % 2 != 0) { printf("%dは奇数です\n", i); continue; } } printf("ループ終了\n"); return 0; } // 実行結果 0回目 0は偶数です 1回目 1は奇数です 2回目 2は偶数です 3回目 3は奇数です 4回目 4は偶数です 5回目 5は奇数です 6回目 6は偶数です 7回目 7は奇数です 8回目 8は偶数です 9回目 9は奇数です ループ終了
breakのcontinueで、どこまで戻るのかをしっかりと把握してプログラムを書いていきたいです。
C言語のbreak文の飛ぶ先
auです。
今回はループなどの処理を終わりにする"break文"について書こうと思います。
break文の飛ぶ先
C言語を使っていて"break"を使う場合は今はまだ2つしか知りません。それは、「for文、while文のbreak」と「switch、case文のbreak」です。
実際にコードを書いてみたいと思います。
#include <stdio.h> int main(void) { for (int i = 0; i < 10; i++) { printf("%d回目\n", i); switch (i) { case 0: printf("%dのcaseです\n", i); break; case 1: printf("%dのcaseです\n", i); break; case 2: printf("%dのcaseです\n", i); break; case 3: printf("%dのcaseです\n", i); break; } printf("swict文を抜けました\n"); // switch文のbreak先 break; } printf("for文を抜けました\n"); // for文のbreak先 return 0; } // 実行結果 0回目 0のcaseです swict文を抜けました for文を抜けました
このような結果になりました。
switch文でbreakしたらループも抜けると思っていたのでやってよかったと思います。
C言語で関数ポインタの配列
auです。
今回は関数ポインタを配列で呼び出す関数を変えてみたいと思います。
宣言方法
宣言方法は関数ポインタ名の後ろに配列をつけるだけです。
戻り値の型 (*関数ポインタ名[配列数])(引数の型1, 引数の型2...);
これで宣言できます。
実際に使ってみる
今回は、配列の番号によって"足し算、引き算、掛け算、割り算"をするプログラムを書きました。
#include <stdio.h> int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a * b; } int div(int a, int b) { return a / b; } int main(void) { int a = 4; int b = 3; int (*p[])(int, int) = {add, sub, mul, div}; for (int i = 0; i < 4; i++) { switch (i) { case 0: printf("%d + %d = %d\n",a, b, (*p[i])(a, b)); break; case 1: printf("%d - %d = %d\n",a, b, (*p[i])(a, b)); break; case 2: printf("%d * %d = %d\n",a, b, (*p[i])(a, b)); break; case 3: printf("%d / %d = %d\n",a, b, (*p[i])(a, b)); break; default: printf("計算できません\n"); } } return 0; } // 実行結果 4 + 3 = 7 4 - 3 = 1 4 * 3 = 12 4 / 3 = 1
C言語の関数ポインタ
auです。
今回は関数ポインタについて調べました。
関数ポインタとは
関数ポインタとは、関数アドレスを格納するためのポインタ変数のことです。
変数ポインタは以前触れました。それの関数バージョンです。
関数ポインタを宣言する
戻り値の型 (*関数ポインタ名)(引数の型1, 引数の型2...);
このように宣言します。
関数ポインタとアドレスを繋げる関数は、型が一緒でなければなりません。
関数ポインタの名前は任意の名前で大丈夫です。
aとbの足し算をするプログラムを関数ポインタを用いて記述します。
#include <stdio.h> int add(int a, int b) { // int型の関数名addで引数はintが2つ return a + b; } int main(void) { int a = 5; int b = 8; int (*p)(int, int); // int型の関数ポインタ名pで引数はintが2つ p = &add; //ポインタに関数名addのアドレスを格納 printf("%d\n", (*p)(a, b)); // 出力する際の引数にintはいらない return 0; } // 実行結果 13
C言語のmath.hをコンパイルする
auです。
今回はヘッダファイルの"stdio.h"や”string.h”をコンパイルする際にオプションはいらないのに、"math.h"をコンパイルする際は"-lm"を付けなければならないのかを調べてみました。
math.hを使う
math.h(数学関数)の中には
double pow(double x, double y) xのy乗を計算する関数
double fabs(double x) xの絶対値を計算する関数
など、通常のプログラムでは使わない、高度な計算をするときに使うような関数が入っているライブラリです。
このような関数は、普通のプログラムでは使われません。そこで、-lmをつけて、"libm.a"という共有ライブラリとリンクしなければなりません。
stdio.hやstring.hの標準ライブラリと呼ばれるものは、一般的な関数が入っているので、オプションを付けなくても大丈夫です。
なぜリンクが分かれているかは調べてもよくわかりませんでした。
自分の予測では、標準ライブラリと混ぜてしまうとよくない挙動をするのかな?と思いましたが、正直よくわかりません。
もしわかる方がいらっしゃいましたらコメントをお願いします。
VSコードは問題なかった
auです。
昨日VSコードが緑色の波線でエラーかな?と思い記事にしました。
program-shoshinsya.hatenablog.com
しかし、これはアップデート直後に起きる仕様みたいで特に問題ないとのことでした。
実際にコンパイルや実行もできますし、テストも全てVSコードで解くことができました。
最近苦手だとわかっていることは、数式をプログラミングに起こすことです。
答えを導くことができないので、どんな風に組めばいいのかがイメージできないです。
数学は大事だととても感じました。