C语言编程预备知识
文章目录
c语言的框架
# include<stdio.h>
int main(void)
{
//函数体
return 0;
}
CPU 内存条 硬盘 显卡 主板 显示器 之间的关系
硬盘存储的是数据,程序运行时把硬盘的数据调入内存中,显卡使计算机具备显示能力,在显示器输出给用户,而CPU是整个计算机的指挥官。主板为硬件提供了载体。
什么是数据类型
对数据进行的分类 :
**基本类型数据 : **浮点数(单精度float --4 双精度double–8) 整数 (整型int–4 短整型short int–2 长整型long int–8) 字符(单个字符char–1 字符串)
复合类型数据 : 结构体 枚举 共用体
什么是变量
变量的本质就是内存中一段存储空间
变量为什么必须的初始化
所谓初始化就是赋值的意思。当软件运行完毕后,操作系统将回收该内存空间,但操作系统并不清空该内存空间中遗留下来数据,一个软件所分配到的空间中极可能存在着以前其他软件使用过后的残留数据,所以需要初始化来清空内存。
如何定义变量
#数据类型 变量名 = 要赋的值;
#举例子:
int i = 3; #等价于i = 3;
int i , j; #等价于int i; int j;
int i , j=3; #等价于int i; int j; j=3
int i =3, j = 5; #等价于 int i; int j; i=3; j = 5;
int i , j; i=j=5; #等价于 int i ,j ;i =5; j=5;
什么是进制
十进制就是逢十进一
N进制实际就是指逢N进一 (N指基数)
常量在C语言中是如何表示的
整数
十进制: 传统的写法
十六进制:前面加0x或0X
八进制: 前面加0 注意是数字零不是字母O
浮点数
float x = 3.2; //传统写法
float x = 3.2e3; //实际数字是3200,科学计数法
float x = 123.45e-2 //实际数字是1.2345,科学计数法
字符
单个字符用单单引号括起来 'A’表示字符A "AB"正确 ‘AB’错误
字符串用双引号括起来 "A"正确,因为"A"代表了’A’ '\0’的组合
常量以什么样的二进制代码存储在计算机中的
整数是以补码的形式转化为二进制代码存储在计算机中的
实数是以IEEE754标准转化为二进制代码存储在计算机中的
字符的本质实际也是与整数的存储方式相同
什么是字节
字节就存储数据的单位,并且是硬件存储数据的最小单位。
1个字节 = 8位 1K = 1024字节 1M = 1024K 1G = 1024M
###不同数据类型之间的相互赋值问题
int i = 45;
long j = 102345;
i = j;
printf("%d %ld\n",i,j);
float i = 6.6;
double j = 8.8;
printf("%f %lf\n",i,j);
char ch = "AB"; //error是因为"AB"是字符串,我们不能把字符串赋给单个字符
char ch = "A"; //error
char ch = 'AB'; //error
/*
并且一个变量不可以被重复定义
*/
什么是ASCII
ASCII不是一个值,而是一种规定。
ASCII规定了不同的字符用哪一个整数值去表示。
基本的输入和输出的函数的用法
printf()
四种用法
- printf(“字串符”);
- printf(“输出控制符”,输出参数)
- printf(“输出控制符1 输出控制符2…”,输出参数1,输出参数2…)
输出控制符要和推出参数一一对应
输出控制符包含如下
%o %x(或者%X或者%#X) %lf %f %c %ld %dint i = 47 printf("%x\n",i); //输出是2f printf("%X\n",i); //输出是2F printf("%#x\n",i); //输出是0x2f printf("%#X\n",i); //输出是0x2F 推荐使用 /* 为什么需要输出控制符 因为01组成的代码既可以表达数据也可以表示指令 如果01组成的数据表示数据的话,那么同样01代码组合以不同的格式输出就会有不同的结。果 */ - printf(“输出控制符 非输出控制符”,输出参数)
printf("i = %d\n",i); //\n是换行符
scanf()【通过键盘将数据输入到变量中】
两种用法:
用法一: scanf(“输入控制符”,输入参数)
功能: 将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。
# include <stdio.h>
int main(void)
{
int i;
scanf("%d",&i); //&i表示i的地址 &是一个取地址符
printf("i = %d\n",i);
return 0;
}
用法二: scanf(“非输入控制符”,输入参数);
功能: 将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。
非输入控制任必须原样输入
scanf("m%d",&i); //输入的时候必须先输入一个m再输入值。
scanf("%d,%d,%d",&i,&j,&k); //输入时必须要以 参数1,参数2,参数3 这样隔开。
如何使用scanf编写高质量代码
- 使用scanf之前最好先使用printf提示用户以什么样的方式来输入。
- scanf中尽量不要使用非输入控制符,尤其是不要用\n,\n是换行符。
scanf("%d\n",&i); //输入时格式必须是 参数\n 。非常不好的格式
printf("i = %d\n",i);
- 应该编写代码对用户的非法输入做适当的处理
# include <stdio.h>
int main(void)
{
int i ;
char ch;
scanf("%d",&i);
printf("i = %d\n",i);
//.............
while ((ch=getchar()), !='\n')
continue;
/*
用循环清除用户的非法输入的数据
*/
int j;
scanf("%d",&j);
printf("j = %d\n",j);
return 0;
}
运算符
算术运算符
+ - * / %(取余数)
- 除法/的运算结果和运算对象的数据类型有关,两个数都是int,则商就是int,若商有小数,则截取整数部分;被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型,不截取小数部分。如: 16/53 16/5.03.20000 -13/4==-4 -13/-34 e/50 5/3==1
- 取余%的运算对象必须是整数,结果是整除后的余数,其余数的符号与被除数相同。如: 13%31 13%-31 -13%3==-1 -13%23==-13 3%5==3
关系运算符
< <= !=(不等于) ==(等于) > >=
逻辑运算符
!(非) &&(且) ||(或)
赋值运算符
= += *= /= -=
优先级别:
算术>关系>逻辑>赋值
三目运算符
A?B:C
等价于:
if(A)
B;
else
C;
###逗号表达式
格式:
(A,B,C,D)
功能:
从左到右执行,最终表达式的值是最后一项的值。
int i;
int j = 2;
i = (j++ , ++j , j+2 , j-3); //j+2的值不赋给i。
printf("%d\n",i);
/*
在VC++6.0中的输出结果是1
*/
流程控制【重点】
-
什么是流程控制
程序代码执行的顺序 -
流程控制的分类
顺序
选择
定义
某些代码可能执行,可能不执行,有选择的执行某些代码
分类
if- if最简单的用法
格式:
if(表达式)
语句
功能:
如果表达式为真,执行语句,为假,语句不执行。
- if的范围问题
if(1>2) printf("AAAA\n"); printf("BBBB\n"); //在VC++6.0中的输出结果是BBBB /* if默认只能控制A的执行或不执行,语句B一定会执行。 if默认只能控制一个语句的执行或不执行, 如果想控制多个语句的执行或不执行,就必须把这些语句用{}括起来。 */- if…else…的用法
scanf("%d %d",&i,&j); if(i>j) printf("i大于j\n"); else printf("i小于j\n");- if…else if …else…的用法
double delta = 3; if(delta>0) printf("方程有两个解\n") else if (delta == 0) printf("有唯一解!\n") else printf("无解!\n")- c语言对真假的处理
非零即真
真为1假为0 - if举例–求分数的等级
float score; //分数 printf("请输入您的考试成绩:"); scanf("%f",&score); if (score > 100) printf("这是做梦!\n"); else if (score >= 90 && score <=100 ) printf("优秀!\n"); else if (score >= 80 && score <90) printf("良好!\n"); else if (score >= 70 && score <80) printf("及格!\n"); else if (score >=60 && score <70) printf("不及格!继续努力!\n"); else printf("输入分数过低,不要如此自卑!\n");switch - if最简单的用法
TODO待补充
如何看懂一个程序:
- 流程
- 每个语句的功能
- 试数
if常见错误解析
空语句
if(1>2);
printf("AAAA\n");
printf("BBBB\n"); //在VC++6.0中的输出结果是 AAAA BBBB
/*
if(1>2);
等价于
if(1>2)
;
*/
强制类型转化
格式:
(数据类型)(表达式)
功能:
把表达式的值强制转化为前面所执行的数据类型。
例子:
(int)(4.5+2.2) //最终值是6
(float)(5) //最终值是5.000000
int i;
float sum = 0;
for (i=1; i<=100; ++i)
{
sum = sum + 1/(float)(i);
//sum = sum + (float)(1/i); 这样写是不对的,因为1除一个整数再取整一定是0。
//更简单的写法是:sum = sum + 1.0/i;
}
printf("sum = %f\n",sum); //float必须用%f输出
浮点存错所带来的问题
float和double都不能保证可以精确的存储一个小数
举例:
有一个浮点型变量x,如何判断x的值是否是零。
if (|x - 0.000001|<= 0.000001)
是零
else
不是零
为什么循环中更新的变量不能定义成浮点型
因为浮点型是非准确存储
一些琐碎的运算符知识
自增【或者自减】
前自增 -- ++i
后自增 -- i++
前自增和后自增的异同
相同:
最终都使i的值加1
不同:
前自增整体表达式的值是i加1之后的值
后自增整体表达式的值是i加1之前的值
# include <stdio.h>
int main(void)
{
int i;
int j;
int k;
int m;
i = j = 3;
k = i++;
m = ++j;
printf("i = %d, j = %d, k = %d, m = %d\n",i ,j ,k ,m);
/*
在VC++6.0中的输出结果是
i = 4 j = 4 k = 3 m = 4
*/
return 0;
}
为什么会出现自增自减问题
代码更精练
自增的速度更快
学习自增要明白的几个问题
- 我们编程时应该尽量屏蔽掉前自增和后自增的差别
- 自增表达式了不要作为一个更大的表达式的一部分来使用,或者说,i++和++i单独成一个语句,不要它作为一个完整复合语句来使用。
int m = i++ + ++i + i + i++; //这样写不但是不规范的代码
878

被折叠的 条评论
为什么被折叠?



