目录
课程安排
1、常量
2、标识符
3、数据类型
1、基本类型
2、指针类型
3、构造类型
4、空类型
4、取值范围
5、字符和字符串
6、算数运算符
7、关系运算符和逻辑运算符
8、if语句
9、switch语句
指针和指针变量
第一季:C语言语法
第二季:C语言在linux下的应用
第三季:利用Arduino进行开发
定义符号常量
#define BOSS "小甲鱼"
将程序中所有的BOSS替换成小甲鱼
字符串常量,在输出的时候会自动追加一个\0表示编译结束,所以字符串长度一般比输入的多一位
标识符只能是英文字母(A-Z,a-z)和数字(0-9)或者下划线组成
第一个字符必须是字母或者下划线开头
标识符区分大小写
不能使用关键字来命名标识符
整数类型
short int int long int long long int
长度依次递减
浮点数类型
float double long double
字符类型
char
布尔类型
_Bool
枚举类型
enum
sizeof 运算符用于获得数据类型或表达式的长度
sizeof(object);//对象 sizeof(type-name);//类型 sizeof object;//对象
signed可以存放负数
unsigned不可以存放负数
数组类型
结构类型
联合类型
符号位:存放signed类型的存储单元中,左边第一位表示符号位。如果该位为0,表示该整数为正数,如果该位为1,表示该整数是一个负数
无符号的不能用%d 需要用%u
char最大值127位
最小值-128位
#includeint main() { char a='c'; printf("%c=%d\n",a,a);//ASCLL表 return 0; }
输出结果为a=67
#includeint main() { char a=70,b=105,c=115,d=104,e=67; printf("%c%c%c%c\n",a,b,c,d,e); return 0; }
输出结果为fishc
includeint main() { unsigned char height;//用unsigned进行限制,确保取值范围是 0-255 height=170; printf("小甲鱼的身高是%d厘米",height); return 0; }
定义字符串:
#includeint main() { char name[5]={'F','i','s','h','c'}; printf("%s\n",name); printf("Hello\n"); return 0; }
这样输出的结果是乱码,原因是计算机不知道如何停下,为了确定字符在内存里的结束位置,C语言规定在结尾加一个\0 该代码块没有\0的位置,因此可以修改如下
#includeint main() { char name[6]={'F','i','s','h','c','\0'}; printf("%s\n",name); printf("Hello\n"); return 0; }
就是再加一个\0的位置
或者不用中括号里面的数字也可以
#includeint main() { char name[]={'F','i','s','h','c','\0'}; printf("%s\n",name); printf("Hello\n"); return 0; }
或者在大括号里定义字符串常量,用双引号进行定义
#includeint main() { char name[]={"FISHC"}; printf("%s\n",a); printf("Hello\n"); return 0; }
#include#include int main() { inti,j,k; i=1+2; j=1+2*3; k=i+j+-1+pow(2,3); printf("i=%d\n",i); printf("j=%d\n",j); printf("k=%d\n",k); return 0; }
==(等于)
!=(不等于)
#includeint main() { int a=5,b=3; printf("%d\n",1<2); printf("%d\n",a>b); printf("%d\n",a<=b+1); printf("%d\n",'a'+'b'<='c'); printf("%d\n",(a=3)>(b=5)); return 0; }
输出结果: 1 1 0 0 0
!逻辑非
&&逻辑与
||逻辑或
逻辑表达式中,任何非零的数表示真,0表示假
短路求值:又称最小化求职,是一种逻辑运算符的求值策略,只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值
C语言对逻辑与和逻辑或采用短路求值的方法
#includeint main() { int a=3,b=3; (a=0)&&(b=5); printf("a=%d,b=%d\n",a,b); (a=1)||(b=5); printf("a=%d,b=%d\n",a,b); return 0; }
输出结果为 a=0,b=3
a=1,b=3
两个结果都是一旦判断a为真或者假之后 就可以不用管b的赋值情况了,所以b的值仍然是原来的3
#includeint main() { int i; printf("您老贵庚啊:"); scanf("%d",&i); if(i>=18) { printf("进门左拐!\n"); } else { printf("慢走,不送!\n"); } return 0; }
#includeint main() { int i; printf("请输入分数:"); scanf("%d",&i); if(i>=90) { printf("A\n"); } else if(i>=80&&i<90) { printf("B\n"); } else if(i>=70&&i<80) { printf("C\n"); } else if(i>=60&&i<70) { printf("D\n"); } else { printf("E\n"); } return 0; }
#includeint main() { char ch; printf("请输入你的成绩:"); scanf("%c",&ch); switch (ch) { case'A' :printf("你的成绩在90分以上!\n");break; case'B':printf("你的成绩在80~90分之间!\n");break; case'C':printf("你的成绩在70~80分之间!\n");break; case'D':printf("你的成绩在60~70分之间!\n");break; case'E':printf("你的成绩在60分以下!\n");break; default:printf("请输入有效的成绩");break; } return 0; }
else 悬挂
#includeint main() { char israin,isfree; printf("是否有空?(Y/N)"); scanf("%c",&isfree); getchar()//可以过滤回车 printf("是否下雨?(Y/N)"); scanf("%c",&israin); if(isfree=='Y') { if(israin=='Y') printf("记得带伞噢\n"); } else{ printf("女神没空\n"); } return 0; }
等于号问题
#includeint main() { char hasBF; printf("小花你有男朋友吗?(Y/N)"); scanf("%c",&hasBF); if(hasBF=='Y')//这里如果是一个=,就会导致无法出现第二种情况 { printf("那祝你们幸福咯!\n"); } else { printf("那我们在一起吧!\n"); } return 0; }
13 while语句和dowhile语句
循环结构
whlie(表达式)
循环体
#includeint main() { int i=1,sum=0; while(i<=100) { sum=sum+i; i=i+1; } printf("输出的结果是:%d",sum); }
输出结果是5050
类型名*指针变量名
char*pa;//定义一个指向字符型的指针变量
int *pb;//定义一个指向整型的指针变量
取地址运算符和取值运算符
如果需要获取某个变量的地址,可以使用取地址运算符(&)
char*pa=&a;
int *pb=&f;
如果需要访问指针变量指向的数据,可以使用取值运算符(*)
printf("%c,%d\n",pa,pb);
#includeint main() { char a='F'; int f=123; char*pa=&a; char*pb=&f; printf("a=%c\n",*pa); printf("f=%d\n",*pb); return 0; }
避免访问未初始化的指针
例如
#includeint main() { int*a; a=123; return 0; }
指针和数组
#includeint main() { int a; int *p=&a; printf("请输入一个整数:"); scanf("%d",&a); printf("a=%d\n",a); printf("请重新输入一个整数:"); scanf("%d",p); printf("a=%d\n",a); return 0; }
指向数组的指针
如果用一个指针指向数组,应该怎么做呢
char*p;
p=a;//语句1
p=&a[0];//语句2
#includeint main() { char a[]="FishC"; int b[5]={1,2,3,4,5}; float c[5]={1.1,2.2,3.3,4.4,5.5}; double d[5]={1.1,2.2,3.3,4.4,5.5}; int*p=b; printf("*p=%d,*(p+1)=%d,*(p+2)=%d\n",*p,*(p+1),*(p+2)); return 0; }
指针的运算
当指针指向数组元素的时候,我们可以对指针变量进行加减运算,这样做的意义相当于指向指针所在位置向前或向后的第n个元素
对比标准的下标法访问数组元素,这种使用指针进行间接访问是的方法叫做指针法
p+1不是简单的江地址+1,而是指向数组的下一个元素
#includeint main() { char str[128]; printf("请输入鱼C的域名:"); scanf("%s",str); printf("鱼C工作室的域名是:%s\n",str); return 0; }
由上述代码可知,数组名就是一个地址信息
数组名其实是数组第一个元素的地址
#includeint main() { char str[128]; printf("请输入鱼C的域名:"); scanf("%s",str); printf("str的地址是:%p\n",str); printf("str的地址是:%p\n",&str[0]); //printf("鱼C工作室的域名是:%s\n",str); return 0; }
结果如下
str的地址是:00000030b89ff970 str的地址是:00000030b89ff970
#includeint main() { char a[]="FishC"; int b[5]={1,2,3,4,5}; float c[5]={1.1,2.2,3.3,4.4,5.5}; double d[5]={1.1,2.2,3.3,4.4,5.5}; printf("a[0]->%p,a[1]->%p,a[2]->%p\n",&a[0],&a[1],&a[2]); printf("b[0]->%p,b[1]->%p,b[2]->%p\n",&b[0],&b[1],&b[2]); printf("c[0]->%p,c[1]->%p,c[2]->%p\n",&c[0],&c[1],&c[2]); printf("d[0]->%p,d[1]->%p,d[2]->%p\n",&d[0],&d[1],&d[2]); return 0; }
结果如下
a[0]->0000009a5e5ff7da,a[1]->0000009a5e5ff7db,a[2]->0000009a5e5ff7dc b[0]->0000009a5e5ff7e0,b[1]->0000009a5e5ff7e4,b[2]->0000009a5e5ff7e8 c[0]->0000009a5e5ff800,c[1]->0000009a5e5ff804,c[2]->0000009a5e5ff808 d[0]->0000009a5e5ff820,d[1]->0000009a5e5ff828,d[2]->0000009a5e5ff830