C关键字共有32个
数据类型关键字(12个)
char, short, int, long, float, double,
unsigned, signed
struct, union, enum,
void
控制语句关键字(12个)
if, else, switch, case, default,
for, do, while, break, continue, goto, return
存储类关键字(5个)
auto, extern, register, static, const
其他(3个)
sizeof, typedef, volatile
常量:在程序运行过程中,其值不会改变
变量:在程序运行过程中,其值可以改变
在使用前必须先定义,必须指定其数据类型
标识符命名规则
变量初始化:定义的同时赋初值
变量特点
声明和定义的区别
声明变量不需要建立存储空间,eg:extern int a;
定义变量需要建立存储空间,eg:int a;
#include
int mian()
{
//extern 只做声明,不能做任何定义
//声明变量a,没有建立存储空间
extern int a;
a = 10; //error:undefined reference to `a',没有空间无法赋值
//const修饰一个变量为只读,相当于常量
const int b = 10;
b =20; //error: assignment of read-only variable ‘b’
int c = b; //ok
return 0;
}
eg:
#include
#define PI 3.14
int main()
{
float r, s;
printf("Please input r:");
scanf("%f", &r);
s = PI*r*r;
printf("this square is %.2f\n", s);
return 0;
}
右边是低位,左边是高位
进制(逢x进1,接1当x) | 表示 |
---|---|
二进制 | 0, 1 |
十进制 | 0, 1, 2, 3, 4 ,5, 6, 7 |
八进制 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 |
十六进制 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F |
8421法
1111 = 2 3 ∗ 1 + 2 2 ∗ 1 + 2 1 ∗ 1 + 2 0 ∗ 1 = 8 ∗ 1 + 4 ∗ 1 + 2 ∗ 1 + 1 ∗ 1 = 15 = F 1 1 1 1 = 2^3*1 + 2^2*1 + 2^1*1 + 2^0*1 =8*1 + 4*1 + 2*1 + 1*1 =15 =F 1111=23∗1+22∗1+21∗1+20∗1=8∗1+4∗1+2∗1+1∗1=15=F
进制转换
C语言中进制表示
进制 | 表示 |
---|---|
二进制 | C语言不能直接写二进制数 |
八进制 | 以数字0开头,0~7 |
十进制 | 以数字1-9开头,0~9 |
十六进制 | 以0x / 0X开头,09和AF |
eg:
#include
int main()
{
int a, b, c;
a = 123;
b = 0123;
c = 0x123;
printf("[10]%d\n[8]%o\n[16]%x\n", a, b, c);
return 0;
}
术语 | 含义 |
---|---|
bit(比特,位) | 一个二进制数(0/1)表示一位,数据传输以“位”为单位 |
Byte(字节) | 一个字节为8个二进制数(8位),计算机中存储最小单位位字节,数据存储习惯以“字节”为单位 |
WORD(双字节,字) | 2个字节,16位 |
DWORD | 两个WORD,4个字节,32位 |
1 b | 1 bit,1位 |
1 B | 1 Byte,1字节,8位 |
1 k,1 K | 1024 |
1 M(1兆) | 1024 k,1024*1024 |
1 G | 1024 M |
1 T | 1024 G |
1 Kb(千位) | 1024 bit,1024位 |
1 KB(千字节) | 1024 Byte,1024字节 |
1 Mb(兆位) | 1024 Kb = 1024*1024 bit |
1 MB(兆字节) | 1024 KB = 1024*1024 Byte |
存储1字节(8位)大小的数字(char)
eg:
数字 | 原码 | 反码 | 补码 |
---|---|---|---|
+ 1 | 0 000 0001 | 0 000 0001 | 0 000 0001 |
- 1 | 1 000 0001 | 1 111 1110 | 1 111 1111 |
+ 0 | 0 000 0000 | 0 000 0000 | 0 000 0000 |
- 0 | 1 000 0000 | 1 111 1111 | 1 0 000 0000(最高位丢弃) |
1 - 1 = 1 + -1 | 1 000 0010 = -2 | 1 111 1111 = -0 | 1 0 000 0000 = -0 = 0 |
有符号数,最高位是符号位,1代表负数,0代表整数
无符号数,最高位不是符号位,是数的一部分,不包含负数
-0当作2^x使用(最高位舍去)
数据类型 | 占用空间 | 取值范围 |
---|---|---|
char | 1字节 | -128127(-2^72^7-1) |
short | 2字节 | -3276832767(-2^152^15-1) |
int | 4字节 | -21474836482147483647(-2^312^31-1) |
long | 4字节 | -21474836482147483647(-2^312^31-1) |
unsigned char | 1字节 | 0255(02^8-1) |
unsigned short | 2字节 | 065535(02^16-1) |
unsigned int | 4字节 | 04294967295(02^32-1) |
unsigned long | 4字节 | 04294967295(02^32-1) |
eg:
#include
int main()
{
char a = 0xff; //[signed] char
unsigned char b = 0xff;
//原:1 111 1111 反:1 000 0000 补:1 000 0001
printf("signed char:%d\n", a); //-1
//原:1 111 1111 反:1 111 1111 补:1 111 1111
printf("unsigned char:%u\n", b); //255,输出结果以格式控制符为准
return 0;
}
赋值或者运算,不要越界
#include
int main()
{
char a = 127 + 2; //129
//补码:1 000 0001 取反
//反码:1 111 1110 +1
//原码:1 111 1111 -127
printf("%d\n", a); //-127
unsigned char b = 255 + 2; //257
//补码:1 0 000 0001 取反(只取后8位)
//反码:1 0 000 0001
//原码:1 0 000 0001
//warning: large integer implicitly truncated to unsigned type [-Woverflow]
//隐式截断为无符号类型的大整数
printf("%u\n", b); //1
return 0;
}
sizeof不是函数,不用包含头文件,作用为计算一个数据类型的大小,单位为字节
sizeof返回值位size_t,size_t在32位操作系统试下是unsigned int(无符号整型)
eg:
#include
int main()
{
float a;
double b;
printf("char:%ld\nint:%ld\n", sizeof(char), sizeof(int)); //1 4
printf("float:%ld\ndouble:%ld\n", sizeof(a), sizeof(b)); //4 8
int len = sizeof(a);
print("%d", len); //4
return 0;
}
整型变量的输入和输出
格式控制字符 | 含义 |
---|---|
%o | 一个八进制的int类型数 |
%x | 一个十六进制的int类型数,输出字母小写 |
%X | 一个十六进制的int类型数,输出字母大写 |
%u | 一个无符号的十进制的int类型数 |
%hu | 一个无符号的十进制的short类型数 |
%lu | 一个无符号的十进制的long类型数 |
%llu | 一个无符号的十进制的long long类型数 |
%d | 一个有符号的十进制的int类型数 |
%hd | 一个有符号的十进制的short类型数 |
%ld | 一个有符号的十进制的long类型数 |
%lld | 一个有符号的十进制的long long类型数 |
eg:
#include
int main()
{
short a;
int b;
long c;
long long d;
printf("Please input a, b, c, d:");
scanf("%hd%d%ld%lld", &a, &b, &c, &d);
printf("%hd, %u, %o, %x, %X\n", a, a, a, a, a);
printf("%d, %u, %o, %x, %X\n", b, b, b, b, b);
printf("%ld, %lu, %lo, %lx, %lX\n", c, c, c, c, c);
printf("%lld, %llu, %llo, %llx, %llX\n", d, d, d, d, d);
return 0;
}
几种整型比较
数据类型 | 占用空间 |
---|---|
short(短整型) | 2个字节 |
int(整型) | 4个字节 |
long(长整型) | windows为4个字节,linux 32位位4个字节,linux 64位为8个字节 |
long long(长长整型) | 8个字节 |
字符型变量的输入和输出
数据类型 | 占用空间 |
---|---|
char | 1个字节 |
格式控制字符 | 含义 |
---|---|
%c | 一个char类型字符 |
内存中没有字符,只有数字,一个数字对应一个ASCII码
man ascii //linux 查看ASCII表
定义时单引号只包含一个字符(转义字符除外),用数字或者字符赋值等价
字符类型本质上为1个字节大小的整型
小写字母比大写字母大32
eg:
#include
int main()
{
char a = 97;
char b = 'a';
printf("a=%c,b=%c\n", a, b); //a a
printf("a=%d,b=%d\n", a, b); //97 97
char c = 'a';
char d = 'A';
printf("a=%d,A=%d\n", c, d); //97 65
return 0;
}
由反斜杠\组成的多个字符
转义字符 | 含义 | 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 | s数字 0 | 000 |
\ddd | 八进制转义字符,d范围0~7 | 3位八进制数 |
\xhh | s十六进制转义字符,h范围09、af、A~F | 2位十六进制数 |
浮点型变量的输入和输出
数据类型 | 占用空间 | 有效数字范围 |
---|---|---|
float | 4个字节 | 7位有效数字 |
double | 8个字节 | 15~16位有效数字 |
格式控制字符 | 含义 |
---|---|
%f | 一个float单精度浮点型数 |
%lf | 一个double双精度浮点型数 |
eg:
#include
int main()
{
float a = 100.9f;
printf("%f\n", a); //100.900002
double b;
printf("Please input b:");
scanf("%lf", &b); //3.14
printf("%lf\n", b); //3.140000
return 0;
}
限定符 | 含义 |
---|---|
extern | 声明一个变量,extern声明的变量没有建立存储空间 |
const | 定义一个常量,值不可修改 |
volatile | 防止编码器优化代码 |
register | 定义寄存器变量,提高效率,register建议型指令,如果CPU有空闲寄存器则生效 |