基本数据类型

标识符 声明 定义

int a;//声明(引用式声明)并定义(定义式声明)一个名为a的整形变量

int是数据类型关键字,用于声明并定义标识符a(注意:声明和定义是两个不同的概念,这点在多文件程序中会更加充分体现出来。一般在单文件程序中同时完成了声明和定义两个步骤)。

a是一个标识符,标识符一般是变量名、函数名或其他实体的名称。在这种情况下,标识符可以用来指定特定对象的内容。标识符遵循变量的命名规则。在此处,标识符是C程序指定硬件内存中的对象的方式。指定对象的表达式被称为左值。C语言规定编译器至少需要识别局部标识符的前63个字符和外部标识符的前31个字符。

标识符的命名应做到见名知义,同时在软件工程中应采用“驼峰命名法”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

声明可分为定义式声明引用式声明。一般地,采用声明代指引用式声明定义代指定义式声明

通过声明(引用式声明),编译器在符号表(类似于哈希表/C++中的map/Python中的字典数据类型,添加一对一的映射关系)中创建一个表项,用于记录标识符a是一个整形变量;通过定义(定义式声明),编译器根据变量所属作用域不同,在对应内存区域内申请一块关键字大小的内存(全局作用域:全局/静态存储区;块作用域:栈区),C语言将这一块内存称为对象(C语言是面向过程的语言,仅此处提到了对象的概念),并将标识符与申请的内存通过符号表进行绑定,之后通过标识符即可访问该块内存。对象可以存储一个值或多个值。

变量:标识符所代表的量是可变的,最简单的变量是标量变量,如整形变量、浮点型变量、字符型变量等,这些存储单个值的变量叫标量变量。可存储多个值的变量叫矢量变量,如数组、枚举(enum)、结构体(struct)、联合体(union)等。

与之相对,标识符所代表的量是恒常不变的,就是常量。

类型大小

查看数据类型或变量所占的内存大小:sizeof运算符。当sizeof后为数据类型关键字时必须加圆括号,当为标识符时则圆括号可选。为确保跨平台的兼容性,应对数据类型采取sizeof,而并非对大小硬编码(如int可能和short相同,也有可能和long相同)。

可以在<limits.h>和<float.h>中查看整型和浮点型的大小限制相关符号常量。

格式化转换符

格式化转换符出现在格式化字符串中,由以下几部分构成:

格式化转换说明符(即%,用于在格式化字符串中区分字面字符和格式化转换符)+修饰符+数据类型转换符

注意I/O函数根据从左到右的顺序处理,如果出现用错格式化转换符会影响字节的读取,从而影响之后的变量I/O。

整形变量

类型数据范围存储大小备注格式化转换符
char(字符型)0~ 2 8 − 1 − 1 2^{8-1}-1 28111B缺省时是signed char还是unsigned char取决于编译器%c
(%d打印ASCII码)
signed char(有符号字符型) − 2 8 − 1 − 1 -2^{8-1}-1 2811~ 2 8 − 1 − 1 2^{8-1}-1 28111B
unsigned char(无符号字符型)0~ 2 8 − 1 2^{8}-1 2811B
short(全名short int,有符号短整形)- 2 16 − 1 − 1 2^{16-1}-1 21611~ 2 16 − 1 − 1 2^{16-1}-1 216112BC标准中未规定具体范围,仅规定占用存储空间short<=int即可
具体实现取决于编译器
%hd
unsigned short(全名unsigned short,无符号短整型)0~ 2 16 − 1 2^{16}-1 21612B%hu
int(有符号整形)- 2 32 − 1 − 1 2^{32-1}-1 23211~ 2 32 − 1 − 1 2^{32-1}-1 232114BC标准中未规定具体范围,仅规定占用存储空间short<=int<=long即可
一般而言int要么与short相同,要么与long相同。具体实现取决于编译器
%d
unsigned int(无符号整形)0~ 2 32 − 1 2^{32}-1 23214B%u
long(全名long int,有符号长整形)- 2 32 − 1 − 1 2^{32-1}-1 23211~ 2 32 − 1 − 1 2^{32-1}-1 232114BC标准中未规定具体范围,仅规定占用存储空间int<=long<=long long即可
具体实现取决于编译器
%ld
unsigned long(全名unsigned long int,无符号长整形)0~ 2 32 − 1 2^{32}-1 23214B%lu
long long(全名long long int,有符号长长整形)- 2 64 − 1 − 1 2^{64-1}-1 26411~ 2 64 − 1 − 1 2^{64-1}-1 264118BC标准中未规定具体范围,仅规定占用存储空间int<=long<=long long即可
具体实现取决于编译器
%lld
unsigned long long(全名unsigned long long int,无符号长长整形)0~ 2 64 − 1 2^{64}-1 26418B%llu
  1. char类型在C语言中属于整形范围,采用ASCII码存储。
  2. 整形在计算机中存储采用二进制的方式。
  3. 数据范围溢出是未定义行为,一般会从最小范围重新开始一轮循环。
  4. 通过在整形字面常量后增加后缀可将一个较小数据类型当做一个较大数据类型的数据来处理,叫宽整形字面常量。如ULLULLLLU
  5. 枚举类型的变量也当做整形处理。

浮点型

类型存储大小内存分配指数偏移精度格式化转换符
float(单精度浮点型)4B1符号位+8指数位+23尾数位+127C标准并未规定精度范围,仅要求float<=double即可。一般认为是6~7位有效数字%f
double(双精度浮点型)8B1符号位+11指数位+52尾数位+1023C标准并未规定精度范围,仅要求float<=double<=long double即可。一般认为是15~16位有效数字%lf
long double(扩展精度浮点型)16BC标准并未规定精度范围,仅要求double<=long double即可%Lf
  1. 浮点型在计算机中存储遵循IEEE754标准,由符号位、指数位、尾数位组成。
  2. 数据范围溢出:上溢:给变量赋一个无穷大的特定值,并在printf时输出inf(infinity)。下溢:在计算过程中损失了原末尾有效位上的数字。NaN:Not A Number
  3. 在 C 语言中,浮点数默认被视为 double 类型,float 类型会被提升为 double 类型
  4. 科学计数法在计算机中的表示:指数计数法(e计数法)。e即为*10^ 如1e9= 1 ∗ 1 0 9 1*10^9 1109,2e-8= 2 ∗ 1 0 − 8 2*10^{-8} 2108,2.4e3= 2.4 ∗ 1 0 3 2.4*10^{3} 2.4103​​​等。
  5. 通过e指数法表示默认为双精度浮点型字面常量,使用后缀fL可覆盖为float或Long double型,加L后缀叫宽浮点型字面常量。
  6. 使用格式化转换符%e转换成e指数表示法

布尔型(<stdbool.h>)

  • false(0)——假

  • true(非0)——真

常量

  1. 命名常量:通过const限定符进行修饰的标识符,用于限定其为只读。如const int MAX=10;中原本是整形变量的MAX,经过const限定符修饰后就变成了命名常量。const修饰符能限定的东西有很多,比如变量、数组、指针、形参、函数返回值等。

  2. 字面常量(明示常量):在程序中直接使用的常量值,如上例中的10即为字面常量
    字面常量可分类为:整形常量 浮点型常量 字符型常量 字符串型常量 布尔型常量
    字符型常量分别以字符型常量说明符(,即单引号)作为开始和结束,
    字符串型常量以字符串型常量说明符(,即双引号)作为开始和结束,编译器自动在字符串常量末尾处加上\0(字符数组用此种字符串型常量的方式进行初始化才能成为字符串)。字符串型常量属于静态存储类别,若在函数中使用字符串型常量(在整个程序的生命周期内都一直存在),即使函数被调用了多次,该字符串也只会被存储一次。字符串型常量用双引号括起来的内容被视作指向该字符串存储位置的指针,即可用%p打印其地址,也可用解引用符。

    宽字符/字符串型常量:在C语言中用来表示Unicode字符的常量,而不仅仅是ASCII字符。在C语言中,是由L前缀和一个字符、字符串或转义序列组成的,如L'x'L"Hello"。在C++中,也可以使用u、U或者u8前缀。

    说明符只是对编译器的提示作用,而并非常量本身的一部分。

  3. 符号常量:明示常量通过宏定义成为符号常量 例如#define PI 3.14中,PI是符号常量,3.14是明示常量。宏定义是预处理器在编译时进行文本替换的。

  4. 枚举常量

限定符

所有限定符都具有幂等性,即在定义或声明中多次使用同一个限定符,只保留一个,多余的将会被忽略。

  • const(只读限定符):具有恒常性,应用于命名常量 指针常量 常量指针 常量数组 常量结构体 函数形参 函数返回值…
  • restrict:只能用于指针,表明该指针是访问数据对象唯一且初始的方式,从而帮助编译器进行更好的优化。
  • volatile(易变限定符):被声明为 volatile 的变量的值可能会在程序执行过程中被意外修改,因此编译器不应该进行优化,用于硬件开发和多线程并发程序
  • _Atomic:用于多线程并发程序,用于声明原子类型,用于在多线程编程中进行原子操作。

复合字面量

可用于创建数组和结构内容的复合字面量

一维数组

(int [2]){10,20};

符合字面量数组也可以省略数组大小,如:

(int []){10,20};

注:复合字面量是匿名的,因此必须在创建后立即使用,如创建后通过赋值表达式给指针。

int *p=(int []){10,20};
cout<<*p<<" "<<p[1]<<endl;

输出结果:10 20

多维数组

以二维数组为例:

int (*pt2)[4]=(int [2][4]){{1,2,3,4},{5,6,7,8}};

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值