在C?e.g. short
、long
、signed
、unsigned
中组合类型说明符时是否有预期的顺序?如果顺序有意义,更改类型修饰符的顺序会有什么影响?
例如,有时我看到人们使用long unsigned int
,其他时候使用unsigned long int
.这些意思是一样的吗?
在C?e.g. short
、long
、signed
、unsigned
中组合类型说明符时是否有预期的顺序?如果顺序有意义,更改类型修饰符的顺序会有什么影响?
例如,有时我看到人们使用long unsigned int
,其他时候使用unsigned long int
.这些意思是一样的吗?
C17语言标准(N2310)(link)规定了允许的类型说明符:
6.7.2类型说明符
在每个声明的声明说明符中应至少给出一个类型说明符,并且在 每个 struct 声明和类型名称中的说明符-限定符列表.每个类型说明符列表应 是以下多集之一(如果每个多集有多个多集,则用逗号分隔 项);类型说明符可以以任何顺序出现,可能与其他声明混合在一起 说明符.
- void个
- char个
- signed char个
- unsigned char个
- short、signed short、short int或signed short int
- unsigned short或unsigned short int
- int、signed或signed int
- unsigned或unsigned int
- long、signed long、long int或signed long int
- unsigned long或unsigned long int
- long long、signed long long、long long int或signed long long int
- unsigned long long或unsigned long long int
- float个
- double个
- long double个
- _Bool个
- float _Complex个
- double _Complex个
- long double _Complex个
- 原子类型说明符
- struct 说明符或联合说明符
- 枚举说明符
- 类型定义函数名称
其中type specifier在这里表示任意单个单词,例如unsigned
、int
、long
个、etc.这在本节的(1)中定义了,但我在这里没有引用它.
因此,(2)明确表示为"the type specifiers may occur in any order".在本部分的后面部分,我们将进一步说明,逗号分隔列表中的所有多集描述相同的类型:
- 每个逗号分隔的多集指定相同的类型,除了位域 实现-定义说明符int是指定与signed int相同的类型还是指定 和unsigned int是同一类型.
这意味着排序并不重要,因此任何排序都描述相同的类型.
为了代码的一般可读性,请考虑使用规范中实际显示的排序.它们是最常见的.
以下类型相同:
signed long int
个long signed int
个signed int long
个int signed long
个long int signed
个int long signed
个不仅如此,多集列表中的所有其他内容都与上面的内容相同:
long
个signed long
个long signed
个long int
个int long
个让我们来看一个更荒谬的例子.将您的类型称为long signed int long
是有效的,这相当于long long
.你想go 吗?希望不会!
关于您的后续 comments :
我的问题也适用于其他类型的数据类型,如整型、浮点型、字符、双精度型
这完全是由我引用的规范定义的.但让我们以float
为例.出现float
的地方有两个多集.他们是float
岁和float _Complex
岁.例如,世界上没有long float
这样的东西.但你可能会有_Complex float
个.
考虑到这一点,用_Complex
作为例子可能并不是很好:
- 如果实现不支持复杂类型,则不应使用类型说明符_Complex
请注意,char
实际上是一个不同的类型,可以隐式签名或不签名,具体取决于编译器配置.这是与隐式带符号的其他整型的不同之处.