在C?e.g. shortlongsignedunsigned中组合类型说明符时是否有预期的顺序?如果顺序有意义,更改类型修饰符的顺序会有什么影响?

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

推荐答案

C17语言标准(N2310)(link)规定了允许的类型说明符:

6.7.2类型说明符

  1. 在每个声明的声明说明符中应至少给出一个类型说明符,并且在 每个 struct 声明和类型名称中的说明符-限定符列表.每个类型说明符列表应 是以下多集之一(如果每个多集有多个多集,则用逗号分隔 项);类型说明符可以以任何顺序出现,可能与其他声明混合在一起 说明符.

    • void
    • char
    • signed char
    • unsigned char
    • shortsigned shortshort intsigned short int
    • unsigned shortunsigned short int
    • intsignedsigned int
    • unsignedunsigned 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
    • float
    • double
    • long double
    • _Bool
    • float _Complex
    • double _Complex
    • long double _Complex
    • 原子类型说明符
    • struct 说明符或联合说明符
    • 枚举说明符
    • 类型定义函数名称

其中type specifier在这里表示任意单个单词,例如unsignedintlong个、etc.这在本节的(1)中定义了,但我在这里没有引用它.

因此,(2)明确表示为"the type specifiers may occur in any order".在本部分的后面部分,我们将进一步说明,逗号分隔列表中的所有多集描述相同的类型:

  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.你想go 吗?希望不会!


关于您的后续 comments :

我的问题也适用于其他类型的数据类型,如整型、浮点型、字符、双精度型

这完全是由我引用的规范定义的.但让我们以float为例.出现float的地方有两个多集.他们是float岁和float _Complex岁.例如,世界上没有long float这样的东西.但你可能会有_Complex float个.

考虑到这一点,用_Complex作为例子可能并不是很好:

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

请注意,char实际上是一个不同的类型,可以隐式签名或不签名,具体取决于编译器配置.这是与隐式带符号的其他整型的不同之处.

C++相关问答推荐

C限制限定符是否可以通过指针传递?

C sscanf没有捕获第二个参数

在函数中使用复合文字来初始化C语言中的变量

GCC引发不明确的诊断消息

以前版本的tty_ldisc_ops.ioctl()是否也需要文件参数?

在一个小型玩具项目中实现终端历史记录功能

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

如何识别Linux中USB集线器(根)和连接到集线器(根设备)的设备(子设备)?

在C中包装两个数组?

可变宏不能编译

不确定如何处理此编译错误

如何在不读取整个字符串的情况下删除UTF8字符串的尾随空格以提高性能?

具有正确标头的C struct 定义问题

将指针的地址加载到寄存器内联拇指组件中

如何使用 VLA 语法使用 const 指针声明函数

在C中定义函数指针?

如何修复数组数据与列标题未对齐的问题?

Makefile - 将 .o 文件放入子文件夹中

C 中 struct 体自赋值是否安全?特别是如果一侧是指向 struct 的指针?

Clang 是否为内联汇编生成了错误的代码?