#C 语言的变量与基本类型
计算机是用于计算的机器,而程序就是计算的步骤,编程语言的功能就是描述计算的步骤。因此,用于保存值的 变量
是编程中最基本的概念。
定义变量的格式为 变量类型 变量名 = 变量的初始值
,例如:
int age_of_yukari = 17 // 创建名为 age_of_yukari 的变量,类型为整数(int),初始值为 17
int
是变量类型,表示整数age_of_yukari
是变量名17
是变量的值,这种直接写出来的值被称作 字面量(Literal)。
注意,这里的 =
表示的是赋值,也就是将 age_of_yukari
的值设为 17
;而不是数学上的相等。
可以同时定义多个相同类型的变量,例如:
int width = 1920, height = 1080;
- 定义了名为
width
的变量,初始值是 1920 - 定义了名为
1080
的变量,初始值是 1080
#变量的命名规则
变量名只能由 字母、数字 和 下划线 组成,并且不能以数字开头。
一些示例:
正确的名字 | 错误的名字 | 说明 |
---|---|---|
age_of_yukari | age-of-yukari | - 不能用于变量名 |
ageOfYukari | @geOfYuk@ri | @ 不能用于变量名 |
cat2 | 2cat | 变量名不能以数字开头 |
_git_hub | git's_hub | ' 不能用于变量名 |
#整数类型
整数类型的变量用于保存整数值。例如 int x = 10;
定义一个名为 x
的整型变量,并将它的初始值设置位 10。
在计算机中,数据以二进制进行存储。例如 7 的二进制是 111,如果使用 16 位二进制存储则是 00000000 00000111。
计算机使用二进制存储数据,其基本单元称作 字节(byte);一个字节有 8 个二进制位。
在 C 语言中有不同长度的整数类型,例如:
int
是最常用的整数类型,通常为 32 位,能够存储-2147483648
到2147483647
之间的整数;long
通常是 64 位,可以存储更大范围的整数,常在int
范围不够时使用;unsigned int
是无符号的整数类型,通常为 32 位,能存储0
到4294967295
之间的整数,常在明确不需要负数时使用。
示例:
unsigned int age = 18; // 年龄不可能是负数,并且也不太可能超过 4294967295
C 语言中包含以下整数类型:
类型 | 中文名 | 说明 |
---|---|---|
int | 整型 | 用于保存整数,通常为 32 位,范围在 -2147483648 到 2147483647 ,例如:0 ,-1 ,233 |
short | 短整型 | 范围不大于 int |
long | 长整型 | 范围不小于 int |
long long | 长长整型 | 范围不小于 long |
unsigned int | 无符号整型 | 只能表示非负整数,通常为 32 位,范围在 0 到 4294967295 ,例如:0 ,1 , 233 |
unsigned short | 无符号短整型 | 范围不大于 unsigned int |
unsigned long | 无符号长整型 | 范围不小于 unsigned int |
unsigned long long | 无符号长长整型 | 范围不小于 unsigned long |
signed int | 有符号整型 | 等价于 int |
signed short | 有符号短整型 | 等价于 short |
signed long | 有符号长整型 | 等价于 long |
signed long long | 有符号长长整型 | 等价于 long long |
因为 C 语言是接近硬件底层的语言,因此类型的范围不是固定的,而是由架构决定的。
可以通过 limits.h 头文件中的宏获取整数类型的范围。
C 语言中使用后缀来表示不同类型的整数字面量:
字面量后缀 | 字面量类型 |
---|---|
l 或 L | long |
ll 或 LL | long long |
u 或 U | unsigned |
ul 或 UL | unsigned long |
ull 或 ULL | unsigned long long |
示例:
int age_of_yukari_dec = 17; // 没有后缀,表示 int 类型的字面量
long age_of_yukari_hex = 17l; // l 或 L 后缀的整数表示 long 类型的字面量
unsigned age_of_yukari_oct = 17u; // u 或 U 后缀的整数表示 unsigned 类型的字面量
计算机使用二进制存储数据,因此一些涉及底层的开发中常常使用二进制、八进制和十六进制表示数值。
C 语言中使用 0x
前缀来表示十六进制字面量,例如:0xff
,0x1234abcd
。
C 语言中使用 0
前缀表示八进制字面量,例如:023
,0456
。
示例:
int age_of_yukari_dec = 17; // 十进制
int age_of_yukari_hex = 0x11; // 十六进制
int age_of_yukari_oct = 021; // 八进制
部分编译器(非 C 语言标准)可以使用
0b
表示二进制,例如:0b0011
,0b1110
。
#字符类型
字符类型的变量用于保存字母或标点符号等单个字符。例如 char ch = 'A';
定义一个名为 ch
的字符类型变量,并将它的初始值设为字母 A
。
'A'
这样使用一对单引号(''
)包裹的字符是一种字面量,它的值是其中包裹的字符的 ASCII 码,类型是 int
而非 char
;赋值给 char
类型的变量时隐式转换为 char
类型。
C 语言中的 char
虽然被称为字符类型,但实际上只是一个字节。单个 char
类型的变量只能保存一个 ASCII 字符,而无法保存汉字。
类型 | 中文名 | 说明 |
---|---|---|
char | 字符类型 | 用于保存字符,例如 'A' ,'@' ,'\n' |
signed char | 有符号字节 | 范围在 -128 到 127 |
unsigned char | 无符号字节 | 范围在 0 到 255 |
char
在语法和语义上既不是signed char
也不是unsigned char
;在实现上可能有符号,也可能无符号,但仅用于保存字符,不要用于保存整数。
示例:
char ch = 'A'; // char 用于保存字符
unsigned char age = 17; // signed char 和 unsigned char 通常用于保存一个字节以内的整数
#浮点类型
浮点类型的变量用于保存小数。例如 float pi = 3.14;
定义一个名为 pi
的浮点型变量,并将它的初始值设为 3.14
。
和整型一样,浮点类型也有不同的长度,但是没有无符号的浮点类型。
类型 | 中文名 | 说明 |
---|---|---|
float | 单精度浮点数 | 用于保存小数,范围通常在 1.175494e-38 到 3.402823e+38 ,例如:0.0f ,3.14159f |
double | 双精度浮点数 | 用于保存小数,范围通常在 2.225074e-308 到 1.797693e+308 ,例如:0.0f ,3.14159f |
long double | 长双精度浮点数 | 范围不小于 int |
因为 C 语言是接近硬件底层的语言,因此类型的范围不是固定的,而是由架构决定的。
可以通过 float.h 头文件中的宏获取浮点类型的范围。
之所以称为浮点型,是因为在计算机存储小数的格式中,用于存储整数部分的位数和用于存储小数部分的位数是可变的,即小数点的位置是浮动的。 与之对应的,一种用于存储整数部分的位数和用于存储小数部分的位数不可变的的格式被称为定点数。
C 语言中使用后缀来表示不同类型的浮点数字面量:
字面量后缀 | 字面量类型 |
---|---|
f 或 F | float |
l 或 L | long double |
示例:
float age_of_yukari = 17.0f; // f 或 F 后缀的小数表示 float 类型的字面量
double age_of_yukari_double = 17.0; // 无后缀的小数字面量是 double 类型
long double age_of_yukari_long = 17.0L; // l 或 L 后缀的小数表示 long double 类型的字面量
#布尔类型
类型 | 中文名 | 说明 |
---|---|---|
bool | 布尔型 | 用于布尔值,取值为 true 或 false |
C 语言中的
bool
本质上是一个整数,true
为1
,false
为0
;并且所有非零的值均视为true
。
在 C23 标准之前需要包含 stdbool.h 头文件才能直接使用
bool
类型以及true
和false
;
否则,只能使用int
类型以及 1 和 0 代替。
示例:
#include <stdbool.h> // 引入标准头文件 stdio.h
bool is_sunny = true;
#空类型 void
C 语言使用 void
表示空类型,常用于表示函数没有返回值或参数;不能用于定义变量。
void x; // 错误,不能定义 void 类型的变量
#强制类型转换
通过 (类型名)值
的方式,可以将“值”强制转换为“类型名”的类型。
示例:
double pi = 3.14;
int pi_int = (int)pi; // 得到 3