数値を範囲内に収める | Programming Place Plus C言語編 逆引き

トップページC言語編逆引き

このページの概要

以下は目次です。

目的

ある数値を、一定の範囲(任意の下限値~上限値)に収まるように調整したいとします。

すでに範囲内に収まっているのなら何もせず、範囲外に出ていたら、下限値か上限値に揃えます。たとえば、下限値を 0、上限値を 100 としたとき、

この手の処理はよく clamp という名前で、ライブラリなどに含まれているものですが、C言語にはありません。

方法①(自力で実装する)

自力で実装します。割とよくある処理なので、関数化することにします。

実装自体は単純で、最小値より小さければ最小値を、最大値より大きければ最大値を、どちらでもなければ(範囲内にあれば)そのまま返すような関数を書けばいいだけです。

#include <stdio.h>

/*
    数値を範囲内に収める

    引数
        value: 対象の数値
        min:   下限値
        max:   上限値
    戻り値
        value が min より小さかったら min
        value が max より大きかったら max
        いずれでもなければ value
*/
int clamp(int value, int min, int max)
{
    if (value < min) {
        return min;
    }
    else if (value > max) {
        return max;
    }
    return value;
}

int main(void)
{
    const int min = 0;
    const int max = 100;

    printf("%d\n", clamp(-100, min, max));
    printf("%d\n", clamp(-1, min, max));
    printf("%d\n", clamp(0, min, max));
    printf("%d\n", clamp(10, min, max));
    printf("%d\n", clamp(100, min, max));
    printf("%d\n", clamp(101, min, max));
    printf("%d\n", clamp(1000, min, max));
}

実行結果:

0
0
0
10
100
100
100

関数で実装すると型が限定される問題はあるので、関数形式マクロで実装する手段もあります。

#define clamp(value,min,max)                        \
    ((value) < (min)) ? (min)                       \
                      : ((value) > (max)) ? (max) : (value)

この場合は、マクロであることに起因するいつもの問題(第28章)に気を付けなければなりません(たとえば、clamp(++a,min,max) のような使い方で失敗する)。


参考リンク


更新履歴



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る