auの日記

プログラミング初心者の日記。(auはハンドルネームです)

MIPSとは

auです。
今回は"MIPS"について調べてみました。

MIPSとは

MIPS(みっぷす)とは、Million Instructions Per Secondの略です。
CPUの処理性能のことで、1秒当たり100万回の命令実行回数を意味する言葉です。
分岐がほどんどない命令を実行させた際の性能を示すため、実際のアプリケーションでの性能ではない。
CPUの性能の比較などで使われるが、同じ命令処理が行えるものではないと比べることができない。

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コードで解くことができました。

最近苦手だとわかっていることは、数式をプログラミングに起こすことです。
答えを導くことができないので、どんな風に組めばいいのかがイメージできないです。
数学は大事だととても感じました。