我尝试定义'自然'类型,如:
typedef unsigned int nat;
但是如果我定义一个nat变量,那个变量的行为就像普通的int:
nat natural_index;
natural_index = 10; // That's what I want.
natural_index = -10; // Still a valid option.
在简历中,我想知道为什么编译器没有显示消息,比如 “-10不是unsigned int”,我该怎么做才能定义'自然'类型。
额外信息:我“printf”变量natural_index,并打印了值“-10”。我至少预计,另一个正数(不完全是10)。
答案 0 :(得分:5)
C在两个不同的级别上不支持您要执行的操作。
首先,C中的typedef
不会创建新的不同类型;它只是为原始类型创建一个简写名称。因此,在
typedef unsigned int nat;
声明
nat natural_index;
100%相当于
unsigned int natural_index;
(typedef
的重点是什么呢?当基础类型"根据目标架构可能有所不同时,它最有用;例如,标准typedef uint64_t
可能是unsigned long
或unsigned long long
的简写,具体取决于体系结构。)
其次,C没有机制来改变算术表达式是否执行隐式转换。在
natural_index = -10;
赋值运算符会将负数-10
(类型为int
)转换为大的无符号数(即(UINT_MAX - 10) + 1
,这可能是,但不一定是4,294,967,286)进程,并没有办法禁用它。
你的选择是使用一种实际上支持这种事物的语言(例如Ada,Haskell,ML)或写一个" linting"解析C本身并强制执行您希望它强制执行的任何规则的程序(现有示例为lint
和sparse
)。
答案 1 :(得分:2)
你忘了用分号;
分隔表达式语句。
natural_index = 10;
natural_index = -10;
在评估赋值运算符-10
期间, =
为一个大的带符号数。
6.5.16.1p2
(简单分配)说:
在简单赋值(=)中,右操作数的值将转换为赋值表达式的类型。
当您使用存储类说明符typedef
时,这会告诉解析器在解析器的环境中或在解析树中为类型nat
添加别名标识符unsigned int
它输出。在这种情况下,nat
将被评估为声明中的类型,因此当您声明具有标识符natural_index
的对象时,与此对象关联的左侧值将具有类型unsigned int
。 / p>