C语言基础之数据类型
一)语言特性
1)关键字
又叫保留字,不允许作为标识符出现在程序中
aute | double | int | static |
---|---|---|---|
break | else | if | struct |
case | enum | long | switch |
char | extern | register | typedef |
const | float | union | return |
continue | for | short | unsigned |
default | goto | signed | void |
do | while | sizeof | volatile |
2)标识符
要在程序中使用变量、常量、函数、数组、结构体、指针等,就要为这些形式设定一个名称,而这些所谓的名称就是标识符。
- 命名规则:
- 所有标识符必须由字母或下划线"_" 开头,不能是数字或其他符号
- 除了开头,其他位置由字母、下划线、数字组成
- 区分大小写字母
- 不能是关键字,故关键字也称保留字
- 命名最好具有相关含义
- ANSI标准规定,标识符可以为任意长度,但是必须仅前八个字符就能区分。(不同规范,标准不一。不同编译环境,也未必相同)
- 命名 规范:
- 常量统一为大写
#define MAX 1024
- 普通变量,取与实际意义相关名称,首字母前添加类型的首字母,且名称首字母大写
int iNumber = 1;
float fNumber = 1.0;
double dNumber = 1.0;
long lNumber = 1;
- 指针:标识符前添加p,名称首字母大写
int* pNumber;
- 函数:首字母大写,后面大小写组合
int FindMax(int iNumber, int iNumber)
3)注释
/*单行注释*/
int iNum = 1; /*在语句后*/
/*
多行注释
多行注释
*/
二)数据类型
- 基本数据类型:
- 整形:短整型、整形、长整型、无符号整形等
- 字符型
- 实型(浮点型);单精度整形、双精度整形
- 枚举类型
- 构造数据类型:
- 数组类型
- 结构体类型
- 共用体类型
- 指针类型
- 空类型
三)常量
1)数值常量:
a)整形常量
- 整形常量就是直接使用的整形常数
- 整形根据所占字节数的不同分为短整型、基本整形、长整型
- 根据有无符合分为无符号整形和有符号整形
- 在常量后面加上符号修饰:L表示该常量为长整型;U表示无符号整形,大小写均可。
long a = 10L;
unsigned b = 10U;
- 整形常量有三种形式进行表:八进制、十六进制、十进制
八进制:常量前面加0进行修饰,所含数字0至7;
十六进制:0x作前缀修饰,所含数字0至9,字母A至F,大小写均可;
十进制:不加前缀修饰,所含数字0至9;
int a = 10; /*十进制*/
int b = 012; /*八进制*/
int c = 0xA; /*十六进制*/
/*以下均非法*/
a = 08;
a = 0129;
a = 0x123j;
b)实型常量
也称浮点数,由整数部分和小数部分构成,用小数点隔开。
- 一般计数方式:使用十进制的小数方式描述
a = 1.23;
b = 0.01;
- 指数方式:使用e或E做指数
a = 2e2; /*200*/
b= 2e-2; /*0.02*/
- 使用F和L分别修饰float单精度浮点型和long double长双精度浮点型,后缀大小写通用。
- 默认为double双精度浮点型
2)字符型常量
a)字符常量
使用单引号括起来的一个字符,就是字符常量,如:‘1’、‘a’、’#’、'A’等。
注意:
- 字符常量中只能包含一个字符,不能是字符串,如:'ab’非法
- 字符常量区分大小写
- 单引号对 ’ ’ 代表界定符,不是字符常量的一部分。
b)字符串常量
- 使用一组双引号括起来的若干字符序列,若字符串中无字符,称为空串,即"",其长度为零。
- C语言中存储字符串常量时,系统在其末尾自动添加一个技术标志"\0",在编写时不必手动添加。
- 字符常量与字符串常量区别:
- 界定符不同
- 长度不同,空串为0,其余要加上"\0"的长度
- 存储方式不同,字符常量存储的是字符的ASCII值,字符串还要存储"\0"
c)转义字符
- 一种特殊符号,计算机遇见时自动转换为对应操作
- 以反斜杠“\”开头的字符
转义字符 | 意义 | ASCII码 |
---|---|---|
\n | 回车换行,将当前位置移到下一行开头 | 010 |
\t | 水平制表,相当于Tab键 | 009 |
\b | 退格,将当前位置移到前一列 | 008 |
\r | 回车不换行,将当前位置移到本行开头 | 013 |
\v | 垂直制表 | 011 |
\a | 响铃 | 007 |
\f | 换页,将当前位置移到下页开头 | 012 |
\ | 代表一个反斜线字符’’’ | 092 |
’ | 代表一个单引号(撇号)字符 | 039 |
" | 代表一个双引号字符 | 034 |
? | 代表一个问号 | 063 |
\0 | 空字符 | 000 |
\ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 |
\xhh | 十六进制所代表的任意字符 | 不限位数 |
3)符号常量
宏定义
#define MAX 1024
/*MAX就是1024,是一种宏替换*/
四)变量
整型变量
类型 | 完整关键字 | 最简版 | 其他版本 |
---|---|---|---|
有符号基本整型 | signed int | int | |
无符号基本整型 | unsigned int | unsigned | |
有符号短整型 | signed short int | short | short int |
无符号短整型 | unsigned short int | unsigned short | |
有符号长整型 | signed long int | long | long int |
无符号长整型 | unsigned long int | unsigned long |
- 一般都使用最简的写法。
- 不同类型区别在于:在内存中所占字节数不同、取值范围不同
- 故程序员应根据需求合理使用不同类型变量
- 变量的定义、初始化、赋值:
+ 定义: 变量类型 变量名;
+ 初始化:变量在定义时赋初值
+ 赋值:变量定义后赋值,只有定义后才能赋值
/*以有符号长整型为例*/
long lNum; /*定义*/
lNum = 2; /*赋值*/
long lNum2 = 3; /*定义并初始化*/
/*错误*/
lNum3 = 4;
long lNum;
实型变量
又称浮点型变量,用于存储浮点型数值的变量。
类型 | 关键字 |
---|---|
单精度浮点型 | float |
双精度浮点型 | double |
长双精度浮点型 | long double |
- 区别:在内存中所占字节不同,取值范围不同,精度不同。
- 定义:
float a = 0.1;
double b = 0.1;
long double c = 0.1;
c = 0.2;
字符型变量
- 用于存储字符常量的变量。将一个字符常量存储到一个字符变量中,实际上实际上是将其对应的ASCII值(一个无符号整数)存储到内存单元中去。
- 一个字符型变量在内存中占一个字节。
- 使用关键字char定义字符变量。
- C语言允许字符型数据与整形数据间通用,按照ASCII值一一对应。
char cChar = 'a';
char cCh = 96;
printf("%d\n",cChar);
printf("%d\n",cCh);
printf("%c\n",cChar);
printf("%c\n",cCh);
结果:
96
96
a
a
两者通用。
五)变量的存储类别
1)静态存储、动态存储
- 静态存储:程序运行时为其分配 固定存储空间,直至运行结束才清除。
- 动态存储:程序运行期间根据需要动态的分配存储空间,用时分配,用完删除。
- 作用域:变量起作用的区域,在此区域内可以自由合法地使用变量,在作用域外使用该变量,是非法的。
- 函数的内部变量:在函数内定义的变量,其作用域为从定义处开始,到函数结束处。
- 函数的外部变量:在函数外定义的变量,作用域需依据具体情况分析。
- 若一区域内变量与全局变量重名,则全局变量作用域不包含此区域。
#include<stdio.h>
int a; /*a为全局变量,作用域为从定义处开始,到程序结束*/
void main(){
int b; /*b为局部变量,作用域为从定义处开始,到主函数main()结束,但不包含其中的子函数*/
void print(int x)
{
int c; /*c为局部变量,作用域为从定义处开始,到子函数print()结束处结束,但不包含其中的子函数*/
int a; /*作用域与c类似,区域外的a在函数不起作用*/
....
printf(".....")
....
}
}
2)自动:aute变量
- auto关键字用于定义一个局部变量为自动型,即每次执行该定义语句时,都会产生一个新变量,并对其初始化。
- 关键字auto是可以省略的,在定义变量时,若不特别指定,默认为自动型。
/*定义*/
aute int a=1;
aute float b=0.1;
/*省略,默认自动型变量*/
int a=1;
float b=0.1;
3)静态:static变量
- 为静态变量,在函数的内部使用static变量和在函数外使用意义不一样。
- 初始化操作只在第一次执行时起作用,然后变量将保持上一次执行时的值。
int i;
for(i=0;i<2;i++){
static int iNum=1; /*只执行一次*/
iNum = iNum + 1;
printf("%d\n",iNum);
}
结果:
2
3
与自动型区别:
int i;
for(i=0;i<2;i++){
auto int iNum=1; /*每次都执行执行*/
iNum = iNum + 1;
printf("%d\n",iNum);
}
结果:
2
2
4)寄存器:register变量
- 称为寄存器存储型变量
- 程序员使用register变量,把局部变量指定存放在计算机的某一硬件存储器中,而不是内存中。
- 可以程序运行速度(理论上)
- 无法获取寄存器型变量的地址。
register int a;
a = 1;
5)外部存储变量,使用extern声明
- 在一个单元定义了的变量,需要在另一个单元中使用,用extern声明
- 所声明的变量必须已经定义,否则会报错。
如
int main(){
int a;
a = 1;
int MaxOne(int x){
extern a; /*需要在子函数中使用变量a,而不选择参数的传递*/
if(a > x)
{
return a;
}
else
return x;
}
}
- 引用另一文件中定义的变量。
- 即在超出该变量的作用域外使用该变量,需使用extern声明,使其作用域扩大。
六)混合运算中的隐性类型转化
不同类型数据 之间可以进行混合运算,所以 在计算时不同类型数据要进行类型转化,隐性的,即计算机自动进行的,需考虑数据精度的丢失。
遵循规则: