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