01. 常量和变量
(1)C语言32个关键字
-
数据类型关键字(12个)
char,short,int,long,float,double
unsigned,signed,struct,union,enum,void
-
控制语句关键字(12个)
if,else,switch,case,default,for,do,while,breakcontinue,goto,return
-
存储类型关键字(5个)
auto,extern,register,static,const
-
其他关键字(3个)
sizeof,typedef,volatile
(2)数据类型
#include <stdio.h>
int main()
{
//字符型
char ch = 'a'; //字符数据整型,大小:占1字节,0-127
//整型
short s = 10; //短整型,大小:占2字节
int i = 20; //整型,大小:占4字节,
long l = 30; //长整型,大小:占4字节,
long long ll = 40; //更长的整型,大小:占8字节,
//浮点型
float f = 3.14; //单精度浮点型,大小:占4字节。
double d = 3.1415926; //双精度浮点型,大小:占8字节,
return 0;
}
printf()函数的格式化输出:
#include <stdio.h>
int main()
{
int a = 3; //定义 整型变量a, 赋初值3
int b = 5; //定义 整型变量b, 赋初值5
int c = a + b; //定义 整型变量c, 赋值a+b的结果
printf("%d + %d = %d\n",a,b,c); //%d:格式匹配符,匹配整型数据。
return 0;
}
(3)变量和常量
常量:在程序运行过程中,其值不能被改变的量
- 整型常量:100、-100
- 浮点型常量:3.14、-0.23
- 字符型常量:‘a’、‘1’、‘\n’
- 字符串常量:“a”、“abcd”、“1234”
变量:在程序运行过程中,其值可以改变
- 程序运行期间,运行修改
- 变量名字遵守命名规则
- 定义变量时,必须有相应的类型
- 同一个代码块{ }内部,不能出现2个同名的定义
标识符命名规则:
- 标识符不能是关键字
- 标书费只能由字母、数字、下划线组成
- 第一个字符必须味字母或下划线
- 标识符中字母区别大小写
#include <stdio.h>
int main()
{
int i; //定义一个变量 名字是i,类型是int
i = 0; //将i赋值为10
int a = 0; //变量初始化,定义变量时同时赋值叫初始化
return 0;
}
(4)define宏定义、const关键字
#include <stdio.h>
/*
1、#开头的语句是预处理语句,无需分号结束
2、定义一个宏定义标识符PI,他代表3.14,PI是常量
3、宏定义以后的代码都可以使用PI来表示3.14
4、在后面出现PI,预处理会替换成3.14
*/
#define PI 3.14
int main()
{
//const关键字,作用是修饰一个变量为只读,让该变量不允许修改
const int c = 100;
return 0;
}
02. 进制
(1)进制之间的互相转换
二进制,“逢二进一”,二进制数没有2
八进制,“逢八进一”,八进制数没有8
-
十进制转二进制方法:用十进制除以2,取余后,逆序数写
例:100 = 1100100b
-
十进制转八进制或十六进制,方法:与二进制类似
例:100 = 0144 = 0x64
-
二进制转十进制方法:二进制的每一位乘以其对应的权值,然后相加
例:11001101 = 1×2^7 + 1×2^6 + 1×2^3 + 1×2^2 + 1×2^0=205
-
八进制或十六进制转换成十进制,方法:与二进制类似
例:07645 = 5+4×8+6×82+7×83=4005
0xABC123 = 10×165+11×164+12×163+1×162+2×161+3×160 -
八进制或十六进制转换成二进制
例:0xDCF968 = 1101 1100 1111 1001 0110 1000b
0725726 = 111 010 101 111 010 110b
-
二进制转换成八进制或十六进制
例:110101101001101 = 065515 = 0x6B4D
-
十进制小数转换成二进制,方法:乘2取整,顺序书写
例:67.86 = 1000011.110111b
-
十进制小数转换成八进制或十六进制小数,方法:与2进制类似
-
二进制小数转换成十进制小数,方法:二进制的每一位乘以其对应的权值,然后相加
例:11010.11011 = 24+23+21+2-1+2-2+2-4+2^-5 = 26.84375
-
二进制小数转换成八进制或十六进制小数
例:1100101101010.11010010101b = 014552.6452 = 0x196A.D2A
-
八进制或十六进制小数转换成二进制小数
例:03242.532 = 011 010 100 010.101 011 010b
0xAB34.BD45 = 1010 1011 0011 0100.1011 1101 0100 0101b
(2)C语言表示相应进制数
十进制数 | 正常的数字1-9开头,如123 |
---|---|
八进制数 | 以数字0开头,如0123 |
十六进制数 | 以0x开头,如0x123 |
二进制数 | C语言不能直接书写二进制数 |
#include <stdio.h>
int main()
{
int a;
a = 10; //以10进制的方式赋值
a = 0123; //以8进制的方式赋值
a = 0xab; //以16进制的方式赋值
printf("a = %d\n",a); //%d,以10进制的方式打印
printf("a = %o\n",a); //%d,以8进制的方式打印
return 0;
}
03. 计算机存储方式(源码、反码、补码)
如存储1字节(8位)大小的数字(char)
原码(用户角度):原始的二进制
- 用户的数字分为正负数,最高位为符号位,0代表正数,1代表负数
- 左边是高位,右边是地位
+1: 0000 0001
-1: 1000 0001
原码存储导致的问题:
- 0有两种存储方式(1000 0000 和 0000 0000)
- 正数和负数相加,结构不正确(计算机只会加不会减,1 + (-1) )
反码:符号位不变,其他位取反(1变0, 0变1)。正数的原码和反码一样
原码存储导致的问题:0有两种存储方式
计算机存储数字是以补码的方式存储(为了解决负数的存储)
补码:反码加1。正数的原码、反码、补码都一样
04. sizeof关键字
sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位是字节。
sizeof的返回值是size_t,size_t在32位操作系统上是unsigned int类型
#include <stdio.h>
int main()
{
int a;
printf("%d\n",sizeof(a)); //4
int len = sizeof(a); //返回值是size_t
return 0;
}
05. 整型
#include <stdio.h>
int main()
{
int a = 10;
scanf("%d",&a); //输入语句,阻塞,等待用户输入内容,按回车结束
printf("a = %d\n",a); // %d代表整型,占4字节
short b;
scanf("%hd",&a);
printf("a = %hd\n",a); //%hd代表短整型,占2字节
long int c;
scanf("%ld",&a);
//%ld代表长整型,Windows占4字节,Linux(32位)占4字节,Linux(64位)占8字节
printf("a = %ld\n",a);
long long int c;
scanf("%lld",&a);
printf("a = %lld\n",a);//%lld代表长长整型,占8字节
return 0;
}
06. 字符型
(1)char类型
内存中没有字符,只有数字
一个数字,对应一个字符,这种规则就是ASCII码
字符类型本质就是1个字节大小的整型
#include <stdio.h>
int main()
{
//字符
char ch = 'a';
printf("ch = %c\n",ch); //%c代表字符,占1字节
//小写字母转大写字母
printf("小写字母转大写字母: %c\n",'a'-32); //小写字母比大写字母大32字节
return 0;
}
(2)转义字符
转义字符 | 含义 | ASCII码值(10进制) |
---|---|---|
\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范围09,af,A~F | 3位16进制 |
#include <stdio.h>
int main()
{
char ch = '\n'; //回车
printf("aaa %c bbb",ch);
printf("aaa \n bbb");
return 0;
}
08. 浮点型
float 单精度 4字节
double 双精度 8字节
#include <stdio.h>
int main()
{
float f = 3.14f; //数值后面加f
printf("f = %f\n",&f); //%f代表单精度浮点型,3.140000 后面默认6位
double lf = 3.14; //数值后面加f
printf("lf = %lf\n",&lf); //%lf代表双精度浮点型,3.140000 后面默认6位
return 0;
}
09. 类型限定符
限定符 | 含义 |
---|---|
extern | 声明一个变量,extern声明的变量没有建立存储空间。 extern int a; |
const | 定义一个常量,常量的值不能修改。 const int a = 10; |
volatile | 防止编译器优化代码 |
register | 定义寄存器变量,提高效率。register是建议型的指令,而不是命令型的指令,如果CPU有空闲寄存器,那么register就生效,如果没有空闲寄存器,那么register无效。 |
#include <stdio.h>
int main()
{
int a;
a = 10;
a = 20;
a = 30;
//编译器会优化,直接 a = 30;
volatile int b;
b = 10;
b = 20;
b = 30;
//编译器不会优化,会一个一个赋值
return 0;
}