C中的数据类型或限定符是多长?

Waf*_*eeq 26 c

我正在读书Programming in C by Stephan G. Kochan.他声称C只有五种数据类型; int,float,double,char_Bool.

怎么样long?它不是内置类型吗?http://www.programiz.com/c-programming/c-data-typeslong是修改大小的限定符.如果它是一个限定符,那么它应该仅用作a long int,而不是单独使用long.

那怎么样_Bool?许多互联网教程都说C中没有布尔类型.

有关:

Lun*_*din 37

他声称C只有五种数据类型; int,float,double,char和_Bool.

这简直过分了.也许是有意的,如果这本书是针对初学者的.

如果您通过C11 6.2.5,它列出了以下不同的数据类型:

字符类型(6.2.5/15)

char
signed char
unsigned char
Run Code Online (Sandbox Code Playgroud)

标准有符号整数类型(6.2.5/4)

signed char
short int
int
long int
long long int
Run Code Online (Sandbox Code Playgroud)

标准无符号整数类型(6.2.5/5)

_Bool
unsigned char
unsigned short int
unsigned int
unsigned long int
unsigned long long int
Run Code Online (Sandbox Code Playgroud)

真正的浮动类型(6.2.5/10)

float
double
long double
Run Code Online (Sandbox Code Playgroud)

复杂类型(6.2.5/11)

float _Complex
double _Complex
long double _Complex
Run Code Online (Sandbox Code Playgroud)

枚举类型(6.2.5/16)

enum {}
Run Code Online (Sandbox Code Playgroud)

void type(6.2.5/19)(void类型是不完整的类型)

void
Run Code Online (Sandbox Code Playgroud)

派生类型(6.2.5/20)

  • 数组类型
  • 结构类型
  • 联盟类型
  • 功能类型
  • 指针类型
  • 原子类型

正式的术语是类型说明符 6.7.2:

type-specifier:
void
char
short
int
long
float
double
signed
unsigned
_Bool
_Complex
atomic-type-specifier
struct-or-union-specifier
enum-specifier
typedef-name
Run Code Online (Sandbox Code Playgroud)

每个声明中的声明说明符中应至少给出一个类型说明符,并在每个结构声明和类型名称的说明符限定符列表中给出.每个类型说明符列表应为以下多个集合之一(以逗号分隔,每个项目有多个多集); 类型说明符可以按任何顺序出现,可能与其他声明说明符混合.
- 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或union说明符
- enum说明符
- typedef名称

我们可以看到,long是一个类型说明符.它不是类型限定符.


unw*_*ind 18

从C11草案第6.2.5节("类型")第4段:

有五种标准符号整数类型,指定为signed char, short int,int,long int,和long long int.

如何在程序文本中指定这些类型是另一个问题,因为语法相当宽松,所以有很多方法.例如,根据6.7.2("类型说明符"),以下是指定相同类型的所有有效方法:

long,signed long,long int,或者signed long int

这是说long本身就是一个有效的类型说明符的类型long int.在C99中也是如此(我,早期的标准也是如此).所以不,这不是一个限定词.

另外,上述可以与之类的东西被混合static,volatile,指针星号,等等.

我建议阅读其他一些书,因为阅读使用与标准不同的术语的书籍令人困惑.在回答有关C的问题时,通常会提到该标准,因此熟悉它是个好主意.

  • "语法相当宽松" - 从未输入更真实的词语.多年前看到`unsigned`是`unsigned int`的同义词后,我很好奇是否单独的'signed`是消费类似的.惊喜(6.7.2).让同事保持警觉的东西. (3认同)
  • @WhozCraig我习惯使用`unsigned`和`signed`,我特别关心标牌,而简单的`int`我不关心,通常是因为我正在使用一些使用`的API int`其中它实际上不需要任何低于0的数字......我发现这是一个很好的组合清晰度和避免多余的打字,fwiw,但不知道我是否在这里占多数. (2认同)