#C语言的基础学习
标签: c语言 数据类型 基本程序
第一章:C程序初步学习
1.怎么去编译C程序
gcc xx.c 会在当前目录下默认生成一个a.out可执行文件
gcc xx.c -o xx(自己随便命名) 会在当前目录下生成一个xx可执行文件
gcc xx.c -o xx -g -Wall 监听整个C程序的警告,并会在当前目录下生成一个xx可执行文件
注意点:只要对C程序进行了修改,都要对其进行gcc编译,重新产生可执行文件
2.注释
1>注释存在的意义
(1)让别人知道该C程序的所属对象,将来便于合作开发
(2)标注代码的功能,便于将来再次开发
(3)注释代码,将当前被注释的代码不会被运行
2>注释有哪些
(1)单行注释://被注释的内容
(2)多行注释:/被注释的内容/
(3)块注释:/被注释的内容/
问题://被注释的内容//这种写法是错的
原因:第一个/会与碰到的第一个*/进行匹配
3.常量
0>常量的特点
(1)不可变
(2)常量不可以作为左操作数
1>常量有哪些?
(1)整型常量:1 2 3
(2)浮点常量:1.2 1.0
(3)字符常量:‘1’ ‘a’
(4)字符串:“1” “hello”
(5)地址常量:0x01 0x02
注意点:
(1)浮点常量分为单精度和双精度1.2f — 1.2d
(2)字符常量必须要用’’括起来,里面有且只能有一个字符
(3)字符串常量必须要用””括起来
2>地址常量
实际上就是一个变量在内存当中存储的地址,将来可以通过地址去访问变量里面的内容
计算机存储的最小单位是字节;Byte
1M=1024KByte
1KByte=1024Byte
1Byte=8bit
4.hello world第一个程序
(1)一个程序有且只能有一个main函数(入口)
(2)main函数很特殊,int可以省略,但是不建议(有些编译不支持这么写)
(3)main函数可以有return,可以没有return,其他函数就不一样
(4)标准的main函数写法
intmain(intargc,char*argv[]){}
5.#incude相当于一个图书馆,里面有很多函数的声明
5.进制
1>进制有哪些?
十进制: 09
八进制:以0开头 07
十六进制:0x开头 0X 0f
a:10
b:11
c:12
d:13
e:14
f:15
二进制:0b 0B开头 01
2>十进制转换成其他进制
十进制这个数不断地除以转成的进制,不断的用商再除,倒着拿到余数就是这个进制的数据
16/2=8…0
8/2=4…0
4/2=2..0
2/2=1..0
1/2=0…1
0B10000==16
5.变量
1>变量的特点
可变的
2>数据类型
int:整数类型
char:字符类型
float:单精度的浮点类型
double:双精度的浮点类型
3>变量的定义(产生)
(1)格式:数据类型 + 变量名;
inta;charch;floatf;doubled;
(2)多个变量的定义
inta,b,c;floata,b,c;
4>数据类型的作用
就是标识某个变量的类型,将来存储什么类型的常量
5>代码块的作用
(1){}就是一个代码块
(2)指明某个变量的使用范围
(3)在同一个代码块里面不能有相同的变量名
6.格式化输出函数
printf:print formatter
1>占位符
%d:是替整型数据占的位置
%f:是替浮点数占的位置
%c:是替字符类型占的位置
%p:是替地址占的位置
2>注意点:
(1)printf里面的参数要占位符要和实际数据类型保持一致,而且个数也要保持一致
(2)printf实际上是打印第一个字符串,说白了,就是碰到\0就不再打印了
3>打印特殊字符
\:\
“:\”
‘:\’ ,’
%:%%
4>输出格式的控制
%m.nf:
n:代表输出来的浮点数小数点后面占几位
m:指的是整个浮点数的宽度,算小数点
m<=n+1+整数部分实际的位数,m无效
m>n+1+整数部分实际的位数,m才有效,左边空出空格填充
%m.nf
%md
%mc
5>单精度和双精度的区别
float类型的数据:精度保留有效数字7位
double类型的数据:精度保留有效数字16位
floatf=123456789.0;printf("%f\n",f);doubled=1234567890123456489.0;printf("%f\n",d);
7.标识符的命名规范
1>硬性规范
(1)只能由数字,字母,下划线组成
(2)不能由数字开头
(3)不能与C语言关键字相同
2>建议规范
(1)不准用拼音,多查字典
(2)尽量使用驼峰或者是下划线分割单词
(3)见名知义
8.格式化输入函数
scanf:scan formatter
(1)用法:是将输入缓存区里面的变量,找到变量的地址,将值给这个变量
(2)输入输出缓存区:\n有强制刷新缓存区的作用
(3)输入多个变量
scanf(“%d%d”,&a,&b);
(4)注意点
不要在scanf里面做太多的动作
不要在scanf里面加\n
(5)吸收输入缓存区里面的回车残留
示例代码:
#includeintmain(){inta;charch;chartemp;//temp只是去吸收\nscanf("%d",&a);//1.scanf("%c",&temp);//2.getchar();默认//3.getc(stdin); 需要指定的到哪边拿scanf("%c",&ch);printf("a=%d\nch=%c\n",a,ch);return0;}
9.字符输入输出函数
(1)输入:getchar(),从键盘读入一个字符
(2)输出:putchar(字符),
示例代码:
#includeintmain(){charch=getchar();putchar(ch);putchar('\n');return0;}
第二章:数据操作
1.算数运算符
+,- , * ,/,% ++ —
%:左右两边的操作数必须是整数
前缀++
示例代码:
intmain(){inta=1;intc=++a;//a=a+1,c=a;printf("c=%d\na=%d\n",c,a);return0;}
后缀++
示例代码:
#includeintmain(){inta=1;intc=a++;//c=a,a=a+1printf("c=%d\na=%d\n",c,a);return0;}
2.位运算符
数据在计算机当中是以二进制进行存储的,是以二进制的补码存在的
数据以补码存储,原码输出
(1)正数的原码,反码,补码
正数的原码
反码:和原码相同
补码:和原码相同
(2)负数的原码,反码,补码
负数的原码
反码:符号位不变,后面依次取反,0->1 1->0
补码:反码的基础之上加1
(3)1+(-1)=0 ?
假设:如果数据在计算机内存中是原码存储的?
1:0000 0001
-1:1000 0001
1+(-1)=-2;
结论:上面的假设不成立
1
原码:0000 0001
反码:0000 0001
补码:0000 0001
-1:
原码:1000 0001
反码:1111 1110
补码:1111 1111
1补码:0000 0001
-1补码:1111 1111
结果:10000 0000
1+(-1)=0;
(4)位运算符有哪些?
|:位或,只要有1就为1
&:位与,只要有0就为0
^:异或,只要不同就为1
~:取反
<<:左移
:右移
3.关系运算符
在计算机当中,0在逻辑上表示为假,1表示为真
>=,<=,==,>,<,!=
4.逻辑运算符
&&:而且 ,事件1&&事件2,两个事件都要成立整个事件才会成立||:或者, 事件1 || 事件2, 两个事件当中只要有一个事件成立,整个事件才成立!:非,!事件,如果事件成立,整个事件就不成立
注意点:
事件1&&事件2;如果事件1不成立,事件2不会被判断
示例代码:
#includeintmain(){inta=2,b=8,c=9;intres=a>b&&c++;printf("%d-%d\n",res,c);return0;}
事件1 || 事件2;如果事件1成立,事件2不会被判断
示例代码
#includeintmain(){inta=2,b=8,c=9;intres=a
5.取地址符
&a;
6.计算数据类型的字节大小
sizeof(数据类型/变量名);
int:4char:1float:4double:8
注意点:
(1)在32位机里面,long , 指针类型是占4个字节
(2)在64位机里面,long , 指针类型是占8个字节
7.三目运算符
(a>b)?a:b
求取a、b中的最大值
#includeintmain(){inta,b,max;printf("input there number:\n");scanf("%d %d %d",&a,&b,&max);printf("%d\n",(a>b?a:b)>max?(a>b?a:b):max);return0;}
8.运算符的优先级
1.()[].->算数运算符->关系运算符->逻辑运算符&& ||->赋值运算符
2.单目运算符->双目运算符->三目运算符->赋值运算符
9.数据精度转换
1.准则
计算机只计算相同类型的数据,类型不同,计算机内部自行转换
char->short->int->float->double
2.强制类型转换: (数据类型) 变量
不会改变变量本身的数据类型,只会转换变量指向的值
强制类型转换尽量避免高精度向低精度转换,会造成精度的损失
第三章 三大流程控制
1.顺序流程控制
顺序执行
2.条件流程控制
if(条件语句)
{
执行语句1;
}
else
{
执行语句2;
}
1.if的条件语句常将常量放置在左边
2.如果if、else只执行一句代码,可省略大括号
实例如下:
#includeintmain(intargc,char*argv[]){inta;scanf("%d",&a);if(!(a&1))printf("%d是一个偶数\n",a);elseprintf("%d是一个奇数\n",a);return0;}
3.ASCII
特殊的字符:A:65 a:97 ‘\0’:0 空格:
#includeintmain(intargc,char*argv[]){charch;printf("input a char:\n"); ch=getchar();if(ch>=65&&ch<=90) {printf("你输入的大写字母\n");printf("你输入的字母的小写为:%c\n",ch+32); }else{printf("你输入的小写字母\n");printf("你输入的字母的大写为:%c\n",ch-32); }return0;}
示例代码:
#includeintmain(){ /* char ch;printf("input a char:\n"); ch=getchar();if(ch>=65&&ch<=90) {printf("你输入的大写字母\n");printf("你输入的字母的小写为:%c\n",ch+32); }elseif(ch>='a'&&ch<='z') {printf("你输入的小写字母\n");printf("你输入的字母的大写为:%c\n",ch-32); }else{printf("你输入的非字母!\n"); }*/ int a,b,max;printf("input two number:\n"); scanf("%d %d",&a,&b); /*if(a>b)printf("%d and %d 的较大值%d\n",a,b,a);elseprintf("%d and %d 的较大值%d\n",a,b,b); */printf("%d\n",a>b?a:b);return0;}
示例代码:
#includeintmain(intargc,char*argv[]){intsales;scanf("%d",&sales);printf("your sales is %.2f\n",sales<=1000?sales:(sales-(sales-1000)*0.05));}
4.switch-case
swith(变量)
{
case 常量1:
语句块;
break;
case 常量2:
语句2;
break;
........
default:
break;
}
//银行ATM的功能仿真#include#includeintmain(intargc,char*argv[]) {//switch()//case 1;的使用intselect_num=0;intaccount_money=10000;intcaozuo_money;intmima=123;intmima_put=0;while(1) {printf(" 银行的菜单选择 \n");printf(" 1.取钱 \n");printf(" 2.存钱 \n");printf(" 3.余额查询 \n");printf(" 4.密码的重新输入 \n");printf(" 0.退出 \n");printf(" 请输入你需要选择的功能的编码(0-4): \n");scanf("%d",&select_num);switch(select_num) {case2://stemaname;printf(" 请输入你需要存钱的金额: \n");printf(" 输入金额必须是100的整数倍: \n");scanf("%d",&caozuo_money);if(caozuo_money>0&&caozuo_money%100==0) { account_money=account_money+caozuo_money; }elseprintf("你输入的金额有误\n");printf("\n");break;case1://stemaname;printf(" 请输入你取钱的金额: \n");printf(" 输入金额必须是100的整数倍: \n");scanf("%d",&caozuo_money);if(account_money0&&caozuo_money%100==0) account_money=account_money-caozuo_money;elseprintf("你输入的金额有误\n");printf("\n");break;case3://stemaname;printf(" 你当前账户的余额为:%d \n",account_money);printf("\n");break;case4://stemaname;printf(" 重新输入密码: \n");scanf("%d",&mima_put);if(mima_put==mima)printf(" 密码正确\n");elseprintf(" 密码错误\n");printf("\n");break;case0://stemaname;//printf(" 选择密码重新输出 \n");//调用exit函数完成这个程序的正常退出exit(0);default:break; } }printf("感谢你的使用,欢迎下次光临邮政银行!\n");return0; }
note:
1.decault 代表case外的其他情况;
2.case语句内不允许定义变量(需要定义时,请加大括号);
3.case,default后需break跳出;
4.case可以不加{},而执行多条语句;
5.switch不建议定义变量;
3.循环流程控制
1.while循环
1.while循环
while(条件){ 代码块;}
2.do-while循环
do{ 代码块;}while(条件);
note:
1.循环次数编写时不确定的情况处理;
2.当while的条件相同时,do-while比while多执行一次;
3.do-while:先执行后判断或语句至少执行一次;
2.for循环
for(初始赋值;条件判断;条件变化)
{
语句块;
}
注意1
1.初始赋值语句只执行一次;
2.条件判断成立,执行语句块,执行完毕,再执行条件变化,进行条件判断;
3.条件不成立,执行循环后的语句;
注意2
for循环内的三个语句都可省略,但是;不能省略
3.循环
注意循环的条件,避免死循环的产生;
while(1)常用于构建不退出系统,如单片机、嵌入式设备的主界面;