C中的变量,值范围有限

时间:2017-06-28 13:52:15

标签: c variables range

我怎样才能在C中有一个变量,其值应该只在20到520之间?我想将变量赋值限制在20到520之间的值? 如果我取一个值从20开始的枚举,我仍然需要在枚举中定义另外519个值。

5 个答案:

答案 0 :(得分:9)

C没有办法直接表达你想要的东西。请注意,即使enum也不会强制执行有效值。您可以为enum分配基础类型的任何值。

您可以随时提出自己的逻辑,例如:如果这是您作为结构建模的对象的一部分:

struct foo
{
    unsigned bar;
};

// [...]

int foo_setBar(struct foo *self, unsigned val)
{
    if (val < 20 || val > 520) return -1;
    self->bar = val;
    return 0;
}

答案 1 :(得分:5)

  

我怎样才能在C中有一个变量,其值应该只在20到520之间?

C中没有这样的数据类型。

即使范围接近某些类型的极限,下溢或溢出的危险仍然是一个问题(例如,想象一个int v; do { scanf("%d", &v); } while(!(v >= 20 && v <= 520)); ,你希望下限为0,但有人可以超出限制范围。)

可以做的是编写自己的结构,访问器和/或枚举来实现这一点。如果您有兴趣,请阅读Paul R的回答。但是我不鼓励你这样做。

我会这样做,例如,变量是由用户填写的:

{{1}}

以便一次又一次地提示用户,直到他的输入符合标准。

PS:这听起来像一个XY问题。

答案 2 :(得分:5)

不幸的是,C不提供对struct成员的访问控制。一开始运气不好。

您必须(尝试?)以任何合适的方式解决此限制。人们可能会隐藏用户的数据:

type.h:

#include <stdbool.h>

struct TheType;
typedef struct TheType TheType;

unsigned short get(TheType const* type);
bool set(TheType* type, unsigned short value);

type.c:

struct TheType
{
    unsigned short value;
}

unsigned short get(TheType const* type)
{
    return type->value;
}

bool set(TheType* type, unsigned short value)
{
    if(value < 20 || value > 520)
        return false;
    type->value = value;
    return true;
}

这带来了另一个缺点,因为sizeof等其他功能也无法使用......我们可能必须提供至少一个允许用户使用的功能size_t sizeofTheType()分配适当数量的内存和其他东西。

答案 3 :(得分:2)

嗯,你有点可以:

PROGRAM test;

VAR
  x : 20 .. 520;

BEGIN
  x := 20;   // OK
  x := 1000; // error
END.

但是,无论是在编译时还是在运行时,都不会强制执行此范围,但您可以将其用于显式范围检查,并辅助自记录代码。

<小时/> 记住这是C,一种低级语言。如果您希望运行时检查具有用户定义范围的变量,那么请考虑使用Pascal之类的语言,您可以在其中声明子范围变量,如下所示:

{"account:[{"login":"Nik","id":"0","consent":"0","surveyScore":"0","memoryScore":"0","towerScore":"0","tappingScore":"0"}]}

然后在运行时获得范围检查,没有任何显式代码。当然,这会对性能造成不利影响。

答案 4 :(得分:1)

可能在C ++中。但就使用C语法而言,这是不可能的。所以你必须使用如下所示的丑陋DSL。

#include <stdio.h>
#include <assert.h>

#define DEFINE_VAR(x) int ____________________ ## x = 0;

#define VARIDATE_VAR(x) \
  assert(20 <= ____________________ ## x && ____________________ ## x <= 520);

#define SET_VAR(x, y) { \
  ____________________ ## x = y; \
  VARIDATE_VAR(x) \
  }

#define GET_VAR(x) ____________________ ## x


int
main(int argc, char* argv[]) {
  DEFINE_VAR(n);
  SET_VAR(n, 30);
  return 0;
}