整型变量
- 有符号整型:如 int 、 short 、 long 等,加1是在其表示的数值上进行数学意义上的加1操作。若超出该类型表示范围,会发生溢出,结果是不可预测的。例如 int 通常在32位系统中范围是-2147483648到2147483647,对2147483647加1会变为-2147483648。
- 无符号整型:如 unsigned int 、 unsigned short 、 unsigned long 等,同样是数学意义上加1,但由于无符号,范围从0开始,溢出时会从最大值回到0继续计数。如 unsigned int 最大值为4294967295,加1后变为0。
浮点型变量
- 单精度浮点型: float 类型加1是在浮点数的数值上进行加法运算。由于浮点数在计算机中以二进制科学计数法形式存储,可能存在精度问题,不是每次加1都能得到精确的预期结果。例如有些 float 类型变量加1后可能显示为比实际略大或略小的值。
- 双精度浮点型: double 类型与 float 类似,只是精度更高,能更精确地表示小数,但也存在精度限制,在进行加1等运算时可能出现细微偏差。
字符型变量
- 有符号字符型: signed char 加1是对字符对应的ASCII码值进行加1操作。若超出有符号字符型表示范围,也会发生溢出。例如 'z' 的ASCII码值是122,对其加1可能变为一些不可打印的特殊字符或其他值。
- 无符号字符型: unsigned char 同样是对ASCII码值加1,范围通常是0到255,不同类型指针变量加一。
- 指向基本数据类型的指针: 如 int 、 char 、 float 等,指针加1时,地址会根据所指类型的大小进行偏移。例如 int 型指针,通常 int 占4字节,指针加1后地址增加4字节; char 型指针, char 占1字节,指针加1地址就增加1字节; float 型指针一般占4字节,加1后地址增加4字节。
- 指向数组的指针:对于一维数组,数组名可看作指向数组首元素的指针。若有 int arr[10]; , arr 是指向 int 的指针, arr + 1 指向 arr[1] ,偏移量为一个 int 的大小。对于二维数组 int arr[3][4]; , arr 是指向包含4个 int 元素的一维数组的指针, arr + 1 会跳过一行4个 int 元素,偏移量为4倍 int 大小。但对于特殊的&arr,其取出的是数组的地址,+1跳过的是整个数组。
- 指向结构体的指针:结构体指针加1,地址偏移量为结构体类型的大小。假设有结构体 struct Student { int id; char name[20]; }; , struct Student *p; , p 加1后,地址会增加 sizeof(struct Student) 字节,即 id 成员和 name 数组占用空间之和,指向下一个 struct Student 类型的结构体变量。
- 指向函数的指针:函数指针指向函数的入口地址,加1操作无实际意义,C语言标准未对其定义具体行为,可能导致程序错误或未定义的行为。超出255会从0开始循环。
总之,加1减1实质上就是对其变量类型进行相应的变量类型的变化,如int*类型的数据,加1减1就对其地址进行一个int*大小的变化。