最も一般的な解決策は、増加した値が実際に前の値よりも大きいかどうか、または減少した値が前の値よりも小さいかどうかを確認することです。これは、変数のサイズに関係なく、値が unsigned の場合にのみ機能し、C コードと同じくらい移植性があります。
static void update_value(char op)
{
if (op == '+') {
if (value + 1 > value) value ++;
} else {
if (value - 1 < value) value --;
}
}
コードは符号付きの値で動作する可能性がありますが、C 標準ではこれは未定義の動作であり、コンパイラは自由に に置き換えることができることに注意if (value + 1 > value) ...
してくださいif (1) ...
。リンクされた後に生成されたオブジェクト コードを監査するプロセスがない限り、このコードを符号付きの値で使用しないでください。
-fwrapv
gcc と clang では、このコードが符号付きの値に対して機能するようにオプションを追加する必要があります。他のコンパイラでは、走行距離が異なる場合があります。
これを行う適切な方法は、タイプ固有であり、 の定数を使用することlimits.h
です。例えば:
#include "limits.h"
static void update_int(char op, int *value)
{
int val = *value; // ignoring NULL pointer dereference
if (op == '+') {
if (val != INT_MAX) *value = val + 1;
} else {
if (val != INT_MIN) *value = val - 1;
}
}
static void update_int(char op, unsigned int *value)
{
unsigned int val = *value; // ignoring NULL pointer dereference
if (op == '+') {
if (val != UINT_MAX) *value = val + 1;
} else {
if (val != UINT_MIN) *value = val - 1;
}
}