2.1.1关键字
-
C的关键字共有32个
-
数据类型关键字(12个)
char(字符型)/char取值范围为-128到127
unsigned char为0-255/,short(短整型)*/16位系统中一个short(两个字节)能储存的范围为-32768~32767,而unsigned(无符号)short能储存的数据范围则是0-65535}/*
,int(整型),long(长整型)*/4个字节,{-2^31~(2^31-1)}/*,float(单精度浮点数),double(双精度浮点数)
*/short=2
int=4
long=4
float=4
double=8 /*
unsigned(无符号的),signed(有符号的)
,struct(结构体)(聚合数据类型)//学生管理系统`
,union(共用体
、联合),一个union对象可以有多个数据成员,但在任何时刻只有一个成员可以有值。**
//“联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。
enum(枚举类型)
enum` `weekday{sun,mon,tue,wed,thu,fri,sat};
enum` `weekday a,b,c;
//或者为:
enum` `weekday{sun,mon,tue,wed,thu,fri,sat}a,b,c;
//或者为:
enum``{sun,mon,tue,wed,thu,fri,sat}a,b,c;
//,void(无类型)void真正发挥的作用在于:
(1) 对函数返回的限定;
(2) 对函数参数的限定。
-
控制语句关键字(12个)
if,(语句)if 语句的3种形式
-
if(表达式)语句 (单分支if语句)
2 if(表达式)语句1 else 语句2 (双分支if语句)
3 if(表达式1)语句1
else(否则)(一般用于if语句),
switch(开关语句、切换语句)(判断选择)
例1
-
int main() {
double score;
printf("请输入分数:
");
scanf_s("%lf", &score);
switch ((int)(score / 10))
{
case 10:
case 9:printf("A(最好)
"); break;
case 8:printf("B(优秀)
"); break;
case 7:printf("C(良好)
"); break;
case 6:printf("D(及格)
"); break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:printf("E(不及格)
"); break;
default:printf("Error!
");
}
return 0;
}
```c
#include<stdio.h>
int main()
{
char rank;
printf("请输入分数等级:(A、B、C、D、E)
");
scanf("%c",&rank);
switch(rank)
{
case'A':printf("A(90~100)
");break;
case'B':printf("B(80~89)
");break;
case'C':printf("C(70~79)
");break;
case'D':printf("D(60~69)
");break;
case'E':printf("E(0~59)
");break;
default:printf("error!
");break;
}
return 0;
}
例3
**default(系统默认值)(计算机等)自动转到(默认值)
for,(循环语句)
最常用的
for(int i = 0; i< 10; i++) //i++ 跟 i=i+1效果相同
{
printf("i = %d
",i);
}
递减式for
for(int i = 10; i > 0; i -= 3) //i-=3 跟 i=i-3效果相同
{
printf("i = %d
",i);
}
递增式for
for(int i = 10; i > 0; i += 3) //i+=3 跟 i=i+3效果相同
{
printf("i = %d
",i);
}
`*do,**(do在一些计算机语言中是保留字,作用大多情况下是开始一层循环,需要和while配合使用)```
do{
循环体
}while(表达式);
while,
do <语句> while(<条件>)
while(<条件>) <语句>;
break(跳出循环)(终止所在层的循环。在 C语言 的 switch(开关语句)中,break 语句还可用来在执行完一个 case(分支)后立即跳出当前 switch 结构。在某些程序调试过程中则使用break设置断点。)
break语句用于do-while、for、while循环语句中时,可使程序终止循环。而执行循环后面的语句,通常break语句总是与if语句联在一起。即满足条件时便跳出循环。
,continue(结束本次循环,而不终止整个循环的执行。而是结束本次循环,进行下一次循环。),
goto,(跳转、转到)
return(返回)
-
存储类型关键字(5个)
auto(自动存储变量的关键字,也就是申明一块临时的变量内存)
,extren,(外部的)(extern关键字都允许其他文件在不确定其定义位置的情况下使用该文件)
register,(缓存器)(修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度)
static,(静态的)
const(只读)(修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。)
-
其他关键字(3个)
sizeof(操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。),
typedef,(定义类型)(一种数据类型定义一个新名字)
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
volatile(易变的)volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
2.1.2数据类型
数据类型的作用:编译器预算对象(变量)分配的内存空间大小
基本类型: 整形(int,short,long),字符型(char),实形/浮点型(float,double)
数据类型: 构造类型: 数组类型,结构类型(struct),联合类型(union),枚举类型(enum)
指针类型:(char *,int *, int **等)
2.1.3 常量
-
常量
-
在程序运行过程中,其值不能被改变的量
-
常量一般出现在表达式或赋值语句中
-
-
整形常量:100,200,-100,0
-
实形常量:3.14,0.125,-3.66456
-
字符型常量:'a','b','c','d','e'
-
字符串常量:"Hello World","输出"
2.1.4变量
-
变量
-
在程序运行过程中,其值可以被改变
-
变量在使用前必须先定义,定义变量必须有相应的数据类型
-
-
标识符命名规则:
-
标识符不能是关键字
-
标识符只能由字母,数字,下划线组成
-
第一个字符必须为字母或者下划线
-
标识符中字母区分大小写
-
-
变量的特点
-
变量在编译时为其分配相应的内存空间
-
可以通过其名字和地址访问相应内存
-
-
声明和定义的区别
-
声明变量不需要建立存储空间.如:extern int a;
-
定义变量需要建立存储空间,如:int b;
-
从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所以的声明都是定义
-
int b 它既是声明,同时又是定义
-
对于extern int b来讲它只是声明不是定义
一般情况下,把建立存储空间的声明称之为'定义',而把不需要建立存储空间的声明称之为'声明'.
2.1.5 使用示例
#include <stdio.h> #define MAX 100 /* 1.#开头的语句是预处理语句,无需分号结束 2.定义一个宏定义标识符MAX,它代表100,MAX它是常量 3.宏定义以后的代码都可以使用MAX 4.在后面出现的MAX,预处理都会替换为100 */ int main(){ MAX; MAX; //const 是一个关键字,作用是修饰一个变量只读 const int b=10086; return 0; }
2.2进制
二进制,八进制,十进制,十六进制
进制也就是进位制,是人们规定的一种进位方法,对于任何一种进制---X进制,就表示某一位置上的数运算时逢X进一位,十进制逢十进一,十六进制是逢十六进一,二进制是逢二进一,以此类推,X进制就是逢X进一.
-
二进制,位,字节与字
我们习惯于十进制的数:10,12等
一个位只能表示0,或者1两种状态,简称bit,一个位是一个bit
一个字节位8个二进制,称为8位,简称BYTE,8个bit是一个字节
一个字(汉字)为2个字节,简称WORD
两个字为双字,简称DWORD
-
八进制
八进制以8为基数的进制系统,c语言当中用0表示八进制,比如:0666 -
十六进制
十六进16为基数的进制系统,c语言当中用0x表示十六进制
16->2 (8421) (4位一分)
16 6 9 4 2
8421 8421 8421 8421
0110 1001 0100 0010
8->2 (421)(三位一分)
8 7 1 4 2
2 421 421 421 421
111 001 100 010
//进制的输出方式 #include <stdio.h> int main(){ int a=10;//什么都不写默认是十进制数据 int b=010;//数字前面加个0表示八进数据 int c=0x10;//数字前面加个0x表示十六进制数据 printf("%d ",a);//%d表示按照十进制数据输出显示 printf("%o ",b);//%o表示按照八进制数据输出显示 printf("%x ",c);//%x表示按照十六进制数据输出显示 return 0; }
2.3 计算机内存数值存储方式
原码
将最高位作为符号位(0代表正,1代表负),其余各位代表数值本身绝对值
+7的原码是00000111 -7的原码是10000111 +0的原码是00000000 -0的原码是10000000
反码
-
一个数如果为正,那么反码和原码相同
-
一个数如果为负,那么符号位为1,其他各位与原码相反
+7的反码00000111 -7的反码11111000 +0的反码00000000 -0的反码11111111
补码
原码和反码都不利于计算机运算,如:原码表示的7和-7相加,还需要判断符号位
整数:原码,反码,补码都相同
负数:最高位为1,其余各位原码取反,最后对整个数+1
-7的补码:= 10000111(原码) 11111000(反码) 11111001(补码) +0的补码为:00000000 -0的补码为: 10000000(原码) 11111111(反码) 100000000(补码) 补码符号位不动,其他位求反,最后整个数+1,得到原码 用补码进行运算,减法可以通过加法实现 7-6=1 7的补码和-6的补码相加:00000111+11111010=100000001 进位舍弃后,剩下的00000001就是1的补码. 7: -6: 00000111(原码) 10000110(原码) 00000111(反码) 11111001(反码) 00000111(补码) 11111010(补码) 00000111(7的补码) 11111010(-6的补码) 100000001(1) -7+6=-1 -7的补码和6的补码相加:11111001+00000110=11111111 -7: 6: 1000 0111(原码) 0000 0110(原码) 1111 1000(反码) 0000 0110(反码) 1111 1001(补码) 0000 0110(补码)
作业
一、
数据类型关键字
char(字符型)short(短整型)int(整型)long(长整型)float(单精度浮点型)double(双精度浮点型)unsighed(无符号型)signed(有符号型)struct(结构类型)union(联合型)enum(枚举型)void(空型)
控制语句关键字
if(如果)else(否则,另外)
switch(开关)case(情况)default(默认)for(循环)
do (做)while(在...情况)break(打破,跳出循环)continue(继续,结束本次循环进入下一次循环)goto(跳转)return(返回)
存储类型关键字
auto(自动)extern(外来的,表示声明)register(注册,表示频繁使用,建议在cpu)static(静态全局变量)const(常数,表示只读)
其他关键字
sizeof(求内存字节)
typedef(定义类型)
volatile(易变的)
二、
const(常量)可以理解为只读,保护重要程序,节省空间
#define(定义) 宏替换
在C语言中const关键字修饰的变量可以修改
const int x=10086;
int* p=&x;
*p=10010;
三、
15 -10= 5 (10进制)
0000 1111 1000 1010
原码 1000 1010
反码 1111 0101
补码 0000 1111 + 1111 0110= 0 0000 0101
-15 + 10 = -5(10进制)
1000 1111 0000 1010
反码1111 0000
补码1111 0001 + 0000 1010 =1111 1011
验算 原码=补码的反码+1 补码=原码的反码+1
-5补码 1111 1011
补码的反码 1000 0100
-5原码+补码的反码+1 1000 0101 -5