C 中类型说明符的顺序重要吗?

Hal*_*ndD 2 c types

在 C 中组合类型说明符时是否有预期的顺序?例如 short,,,,如果顺序有意义,那么改变long类型修饰符的顺序会产生什么效果?signedunsigned

例如,有时我看到人们使用long unsigned int,其他时候unsigned long int。这些意思是一样的吗?

pad*_*ddy 7

C17 语言标准 (N2310)(链接)指定了允许的类型说明符:

6.7.2 类型说明符

  1. 每个声明的声明说明符以及每个结构声明和类型名称的说明符限定符列表中应至少给出一个类型说明符。每个类型说明符列表应为以下多重集之一(当每项有多个多重集时,以逗号分隔);类型说明符可以以任何顺序出现,也可能与其他声明说明符混合。

    • 空白
    • 字符
    • 签名字符
    • 无符号字符
    • 带符号短短整型带符号短整型
    • 无符号短整型无符号短整型
    • int有符号有符号 int
    • 无符号无符号整型
    • longsigned longlong intsigned long int
    • unsigned longunsigned long int
    • long longsigned long longlong long intsigned long long int
    • unsigned long longunsigned long long int
    • 漂浮
    • 双倍的
    • 长双
    • _布尔
    • 浮动_复杂
    • 双_Complex
    • 长双_Complex
    • 原子类型说明符
    • 结构或联合说明符
    • 枚举说明符
    • 类型定义名称

其中类型说明符在这里表示任何单个单词,例如unsigned, int,long这是在本节的(1)中定义的,但我没有在这里引用它。

因此,(2) 明确指出“类型说明符可以以任何顺序出现”。在本节后面,我们进一步澄清了逗号分隔列表中的所有多重集都描述相同的类型:

  1. 每个逗号分隔的多重集都指定相同的类型,但对于位字段,说明符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. 你愿意吗?希望不是!


关于您的后续评论:

我的问题也适用于其他类型的数据类型,例如 int、float、char、double

这完全由我引用的规范定义。但我们还是举float个例子吧。出现了两个多重集float。他们是floatfloat _Complexlong float例如,不存在这样的事情。但你可以有_Complex float

考虑到以下情况,也许用作_Complex示例并不好:

  1. 如果实现不支持复杂类型,则不应使用类型说明符 _Complex

请注意,这char实际上是一个不同的类型,可以根据编译器配置隐式签名或无符号。这是与其他隐式签名整型的不同点。