このページの解説は C99 をベースとしています。
以下は目次です。
ある数値を、一定の範囲(任意の下限値~上限値)に収まるように調整したいとします。
すでに範囲内に収まっているのなら何もせず、範囲外に出ていたら、下限値か上限値に揃えます。たとえば、下限値を 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;
("%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));
printf}
実行結果:
0
0
0
10
100
100
100
関数で実装すると型が限定される問題はあるので、関数形式マクロで実装する手段もあります。
#define clamp(value,min,max) \
((value) < (min)) ? (min) \
: ((value) > (max)) ? (max) : (value)
この場合は、マクロであることに起因するいつもの問題(第28章)に気を付けなければなりません(たとえば、clamp(++a,min,max)
のような使い方で失敗する)。
return 0;
を削除(C言語編全体でのコードの統一)
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |