一、关键字
关键字是C语言系统保留的标识符。它在C程序中有自己的作用。
C语言常用关键字如下图:
二、数据类型
数据类型的作用:编译器预算对象(变量)分配的内存空间大小
三、常量
- 在程序运行开始至结束都不会改变的量叫常量。
- 常量一般出现在表达式或赋值语句中
常量 | 示例 |
---|---|
整型(int)常量 | 100,200,-100,0 |
实型(float)常量 | 3.14 , 0.125,-3.123 |
字符型(char)常量 | 'a','b','1','\n' |
字符串(char [])常量 | "a","ab","12356" |
符号常量 | #define MAX 100 |
3.1 C语言中使用常量
-
const 数据类型 标识符 = 数据
。const
关键字修饰的数据。const
修饰数据为只读模式。被const
修饰的数据如果在后面发生修改程序编译出错。在C语言中const
修饰的数据不安全,可以通过指针修改。 -
#define 标识符 数据
数据类型会根据标识符后面的数据编译器自动匹配。通过这种方法使用的变量不会被修改。
3.2 常量使用示例
#include <stdio.h>
#define MAX 100
int main(){
const int a = 10; //整型常量。
const float b = 3.14; // 实型常量
const char c = 'A'; // 字符常量
const char d[20] = "Hello World"; //字符串常量
printf("a = %d\n", a); // 输出a=10
printf("b = %f\n", b); // 输出b=3.14
printf("c = %c\n", c); // 输出c='A'
printf("d = %s\n", d); // 输出d="Hello World"
printf("MAX = %d", MAX); // 输出MAX
return 0;
}
3.3 标识符的命名规则
- 由字母(A-Z,a-z)、数字(0-9)和下划线(_)组成
- 数字不能用于标识符开头
- 不能使用关键字作为变量名
- C语言是大小写敏感的语言。同一个单词的字母大小写不同也是不同的标识符。
四、变量
- 在程序运行过程中,其值可以改变
- 变量在使用前必须先定义,定义变量前必须有相应的数据类型
- 变量在编译时为其分配相应的内存空间
- 可以通过其名字和地址访问相应内存
- 概念图
4.1 变量的声明与定义
- 声明: 声明变量不需要建立存储空间
extern
关键字只做声明。- 语法:
extern 数据类型 标识符;
- 标识符不能对其进行赋值,因为没有都其分配存储空间。
- 语法:
- 定义: 声明变量需要建立存储空间
- 语法:
数据类型 标识符[ = 数据];
-
数据类型 标识符;
: 定义一个变量,系统随机的为其赋值 -
数据类型 标识符 = 数据;
:定义一个变量,并初始化值。
-
- 语法:
一般的情况下,把建立存储空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。
4.2 变量使用实例
#include <stdio.h>
int main(){
int a =10; // 定义一个变量a,并初始化为10
int b; // 定义一个变量, 系统会随机的为变量赋值。
printf("a = %d", a); // 输出a = 10
printf("b = %d", b); // 输出b = ?
a = 100;
b = 4;
printf("a = %d", a); // 输出a = 100
printf("b = %d", b); // 输出b = 4
extern int c; // 声明一个变量
c = 10; // 报错,编译不通过。声明的变量没有分配存储空间。不能进行赋值。
return 0;
}
4.3 某个类型的变量
- 定义某个类型的变量
类型 变量名;
: 在内存中开辟一块空间,并将这个空间命名为变量名
- 对变量赋值
变量名 = 值;
: 将值
存放到以这个变量名为标识的内存空间。 - 初始化某个类型的变量
类型 变量名 = 值;
: 在内存中开辟一块空间并为其命名,在将值存放到这个空间中。
定义变量和初始化变量
创建某个类型变量的示例
#include <stdio.h>
int main(){
int a = 10; // 创建一个整型变量,并初始化
float b = 3.14; // 创建一个浮点类型变量,并初始化
double c = 3.11; // 创建一个双精度浮点型变量,并初始化
char d = 'c'; // 创建字符型变量,并初始化
return 0;
}
4.4 整型变量
整型 | 符号 | 占用空间 |
---|---|---|
基本整型 | int |
4字节 |
短整型 | short [int] |
2字节 |
长整型 | long [int] |
Windows系统4字节,Linux系统4字节(32位)8字节(64位) |
超长整型 | long long [int] |
8字节 |
- 需要注意的是,整型数据在内存中占的字节数与所选择的操作系统有关。虽然 C 语言标准中没有明确规定整型数据的长度,但 long 类型整数的长度不能短于 int 类型, short 类型整数的长度不能短于 int 类型。
- 当一个小的数据类型赋值给一个大的数据类型,不会出错,因为编译器会自动转化。但当一个大的类型赋值给一个小的数据类型,那么就可能丢失高位。
[]
里面的内容表示可以省略
4.4.1 整型数据符号修饰signed
&&unsigned
-
signed
: 表示有符号整型数据。C语言对于整型数据默认都是有符号的。即最高位为符号位;0表示正数,1表示负数。 -
unsigned
: 表示无符号整型数据。将存放负数的内存用于存放正数。扩大内存存放数据的大小。
整型 | 符号 |
---|---|
有符号基本整型 | [signed] int |
无符号基本整型 | unsigned int |
有符号短整型 | [signed] short [int] |
无符号短整型 | unsigned short [int] |
有符号长整型 | [signed long [int]] |
无符号长整形 | unsigned long [int] |
有符号超长整型 | [signed] long long [int] |
无符号超长整型 | unsigned long long [int] |
4.4.3 C语言中进制的表示
进制 | 描述 |
---|---|
十进制 | 以正常数字1-9 开头,如123
|
八进制 | 以数字0 开头,如0123
|
十六进制 | 以0x 开头,如0x123
|
二进制 | C语言不能直接书写二进制数据 |
4.4.2 整型数据的输入输出
输出
输入或输出格式 | 含义 |
---|---|
%d |
输出有符号10进制int类型数据 |
%o |
输出8进制int类型数据 |
%x |
输出16进制int类型数据,字母以小写输出 |
%X |
输出16进制int类型数据,字母以大写输出 |
%u |
输出无符号10进制int类型数据 |
示例
#include <stdio.h>
int main(){
int a = 123;
int b = 0123;
int c = 0xabc;
int d;
printf("十进制 a = %d\n", a);
printf("八进制 b = %o\n", b);
printf("十六进制 c = %x\n", c);
printf("输入数字d:\n");
scanf("%d", &d);
printf("输入的d = %d", d);
return 0;
}
其他整型输出格式
输出格式 | 描述 |
---|---|
%hd |
输出short int 整型数据 |
%ld |
输出long int 整型数据 |
%lld |
输出long long int 整型数据 |
%lu |
输出unsigned long int 整型数据 |
%llu |
输出unsigned long long int 整型数据 |
整型常量扩展
常量类型 | 表示 |
---|---|
const long int |
10l /10L
|
const long long [int] |
10ll /10LL
|
const unsigned int |
10u /10U
|
const unsigned long [int] |
10ul /10UL
|
const unsigned long long [int] |
10ull /10ULL
|
输出数据示例
#include <stdio.h>
int main(){
short a1 = 10;
int a2 = 10;
long a3 = 10l; // 10L
long long a4 = 10ll; //10LL
printf("sizeof(short): %lld B\tsizeof(int): %lld B\tsizeof(long): %lld B\tsizeof(long long):%lld B\n", sizeof(short),
sizeof(int), sizeof(long), sizeof(long long));
printf("short a1 = %hd\t int a2 = %d\t long a3 = %ld\t long long a4 = %lld\n",a1, a2, a3, a4);
unsigned short b1 = 2u;
unsigned int b2 = 10u;
unsigned long b3 = 10ul;
unsigned long long b4 = 10ull;
printf("sizeof(unsigned short):%lld B\tsizeof(unsigned int):%lld B\tsizeof(unsigned long):%lld B\tsizeof(unsigned long long):%lld B\n", sizeof(unsigned short), sizeof(unsigned int),
sizeof(unsigned long), sizeof(unsigned long long));
printf("unsigned short b1 = %u\tunsigned int b2 = %u\tunsigned long b3 = %lu\tunsigned long long b4 = %llu\n", b1, b2, b3, b4);
return 0;
}
4.5 字符变量
字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(' ')把字符括起来。
字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。
4.5.1 字符的输出
输出格式:%c
#include <stdio.h>
int main(){
char ch = 'a';
printf("ch = %c", ch); // 以字符形式输出
printf("ch = %d",ch); // 以字符的ASCII编码输出
return 0;
}
4.5.2 字符的输入
#include <stdio.h>
int main(){
char ch;
printf("输入一个字符:\n");
scanf("%c", &ch);
return 0;
}
4.5.3 ASCII码对照表
4.5.4 转义字符
转义字符 | 含义 | ASCII码值(十进制) |
---|---|---|
\a |
警报 | 007 |
\b |
退格(BS),将当前位置移到前一列 | 008 |
\f |
换页(FF),将当前位置移到下页开头 | 012 |
\n |
换行(LF) ,将当前位置移到下一行开头 | 010 |
\r |
回车(CR) ,将当前位置移到本行开头 | 013 |
\t |
水平制表(HT) (跳到下一个TAB位置) | 009 |
\v |
垂直制表(VT) | 011 |
\\ |
代表一个反斜线字符"" | 092 |
\' |
代表一个单引号(撇号)字符 | 039 |
\" |
代表一个双引号字符 | 034 |
\? |
代表一个问号 | 063 |
\0 |
数字0 | 000 |
\ddd |
8进制转义字符,d范围0~7 | 3位8进制 |
\xhh |
16进制转义字符,h范围0~9 ,a~f ,A~F
|
3位16进制 |
4.6 数值溢出
当超过一个数据类型能够存放最大的范围时,数值会溢出。
有符号位与最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失。
#include <stdio.h>
int main()
{
char ch;
//符号位溢出会导致数的正负发生改变
ch = 0x7f + 2; //127+2
printf("%d\n", ch);
// 0111 1111
//+2后 1000 0001,这是负数补码,其原码为 1111 1111,结果为-127
//最高位的溢出会导致最高位丢失
unsigned char ch2;
ch2 = 0xff+1; //255+1
printf("%u\n", ch2);
// 1111 1111
//+1后 10000 0000, char只有8位最高位的溢出,结果为0000 0000,十进制为0
ch2 = 0xff + 2; //255+1
printf("%u\n", ch2);
// 1111 1111
//+1后 10000 0001, char只有8位最高位的溢出,结果为0000 0001,十进制为1
return 0;
}
4.6 浮点型变量
实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种: 单精度浮点数(float
)、 双精度浮点数(double
), 但是double
型变量所表示的浮点数比 float
型变量更精确。
类型 | 占用空间 | 有效数字 | 打印格式 |
---|---|---|---|
float |
4字节 | 7位有效数字 | %f |
double |
8字节 | 15~16位有效数字 | %lf |
由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。
不以f
结尾的常量是double
类型,以f
结尾的常量(如3.14f)是float
类型。
使用示例
#include <stdio.h>
int main()
{
//传统方式赋值
float a = 3.14f; //或3.14F
double b = 3.14;
printf("a = %f\n", a);
printf("b = %lf\n", b);
//科学法赋值
a = 3.2e3f; //3.2*1000 = 32000,e可以写E
printf("a1 = %f\n", a);
a = 100e-3f; //100*0.001 = 0.1
printf("a2 = %f\n", a);
a = 3.1415926f;
printf("a3 = %f\n", a); //结果为3.141593
return 0;
}
4.7 类型限定
限定符 | 含义 |
---|---|
extern |
声明一个变量,不会建立存储空间 |
const |
定义一个常量,常量的值不能修改 |
volatile |
防止编译器优化代码 |
register |
定义寄存器变量,提高效率。register是建议型的指令,而不是命令型的指令,如果CPU有空闲寄存器,那么register就生效,如果没有空闲寄存器,那么register无效。 |
4.8 字符串常量
- 字符串是内存中一段连续的char空间,以'\0'(数字0)结尾。
- 字符串常量是由双引号括起来的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。
字符串常量与字符常量的不同:
每个字符串的结尾,编译器会自动的添加一个结束标志位'\0',即 "a" 包含两个字符'a'和’\0’。
4.9 字符串格式化
printf格式字符
打印格式 | 对应数据类型 | 含义 |
---|---|---|
%d |
int | 基本整型 |
%hd |
short int | 短整数 |
%hu |
unsigned short | 无符号短整数 |
%o |
unsigned int | 无符号8进制整数 |
%u |
unsigned int | 无符号10进制正数 |
%x,%X |
unsigned int | 无符号16进制整数 |
%f |
float | 单精度浮点型 |
%lf |
double | 双精度浮点型 |
%e,%E |
double | 科学计数法表示的数 |
%c |
char | 字符型 |
%s |
char [] | 字符串 |
%p |
type * | 以16进制形式输出指针 |
%% |
% | 输出% |
printf附加格式
字符 | 含义 |
---|---|
l(L) |
附加在d,u,x,o前面,表示长整数 |
- |
左对齐 |
m |
数据最小宽度 |
0 |
将输出的前面补上0直到占满指定列宽为止不可以搭配使用-
|
m.n |
m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度,用于说明输出的实型数的小数位数。对数值型的来说,未指定n时,隐含的精度为n=6位。 |
4.10 输入&&输出
输出
函数 | 作用 |
---|---|
printf() |
格式化输出 |
putchar() |
输出一个字符(一个char) |
puts |
输出一个字符串 |
输入
函数 | 作用 |
---|---|
scanf("%类型格式", &标识符) |
格式输入 |
getchar() |
输入一个字符(一个char) |
gets() |
输入个字符串 |