学习笔记
C编程预备计算机专业知识
1.CPU、内存条、硬盘、显卡、主板、显示器之间的关系
举例:电脑上一部电影的运行
电影存放在电脑硬盘里,打开电影时系统要从硬盘里调入数据进入内存条,然后CPU再去处理内存条里的数据,其中图像数据会通过显卡最终在显示器输出。而主板是CPU、内存条、硬盘、显卡插入的地方,将其组织在一起,给它们之间传输提供平台
视频链接:cpu 内存条 硬盘 显卡 主板 显示器 之间的关系
2.HelloWorld程序如何运行起来的?
#include <stdio.h>
int main(void)
{
printf("欢迎来到C世界!\r\n");
return 0;
}
我们在Visual Studio Code中新建并输入以上代码,然后左上角点文件,选中另存为...记得文件后缀为.cpp进行保存
然后回到vscode界面,再次点击左上角文件,点击保存。此时我们的vscode软件就生成了一个后缀为.exe的可执行文件,点击vscode软件右上角的三角形
软件就会请求操作系统去调用CPU执行exe文件。
视频链接:HelloWorld程序如何运行起来?
3.什么是数据类型
+基本数据类型
| 整数 | ||
|---|---|---|
| 整型 | int | 4字节 |
| 短整型 | short int | 2字节 |
| 长整型 | long int | 8字节 |
举例
#include <stdio.h>
int main(void)
{
int i=10; //表示i变量时整型变量,所谓整型变量就是指i只能存放整数,不能存放实数
printf("%d\n", i);
return 0;
}
如果将数字10改为10.45,运行结果只会是10,如下图
int前可以加short或者long,short存放范围小,long存放范围长,到底长多少,字节又是什么意思?下面会讲
| 浮点数【实数】 | |||
|---|---|---|---|
| 单精度浮点数 | float | 存储范围小 | 4字节 |
| 双精度浮点数 | double | 存储范围大 | 8字节 |
举例
比如你想存个数字3.3,如果用float存储,它占4个字节,用double存储占8字节,用float存储完全可以把3.3存储好,用double会浪费4个字节浪费内存空间。如果存储数据是1.11111111很长的数字,那么用4个字节的存储可能放不下,或者放下了就会丢失数据,这时候就要考虑用double存储,总之要看好数据大小,选用最优存储方法。
字符 char 一个字节
#include <stdio.h>
int main(void)
{
char i='A';
printf("%c\n", i);
return 0;
}
A是一个字符,用char是对的,用int是错误的
复合类型数据:结构体、枚举、共用体(不讲,淘汰掉了)
视频链接:数据类型
视频链接:char使用常见错误
4.什么是变量?
#include <stdio.h>
int main(void)
{
int i;
i=3; //3最终是存放在内存中,程序终止后3所占的空间被释放,不会占用我们的存储空间
printf("i=%d\n", i);
return 0;
}
当软件运行到int i这句话时,会请求我们的操作系统,让操作系统在我们的内存条处找到一个没有被其他程序占用的存储单元,让其和i产生关联,运行到i=3时,就是把3存储到关联的存储单元里去。如果不用变量我们要存储i就会很麻烦,要自己编程序找内存条空闲的存储单元,你还要记住它们的编号,如果要存储100个就要记住100个不同的编号,这几乎不可能,运用变量就方便我们数据的存储,存储地方不用我们考虑。
变量的本质就是内存中一段存储空间
视频链接:什么是变量
5.CPU、内存条、vscode 操作系统之间的关系
拿上面的代码举例,vscode软件写好代码运行后,软件请求操作系统在内存条处找到空闲空间与代码中的i产生关联,CPU调用其中数据进行处理,最终显示结果,其实这和我们上面最开始讲的内容差不多。
视频链接:CPU、内存条、vscode 操作系统之间的关系
6.变量为什么必须初始化
所谓初始化就是赋值的意思
#include <stdio.h>
int main(void)
{
int i;
printf("i=%d\n",i);
return i;
}
如果没有初始化,你i存储的空间可能会遗留上一个程序存储在这个地方的垃圾值,会影响输出,输出的值会不准确,就好像一个体重秤,你不调零,本来你体重很小,但是一站上去体重很大,说明有问题。
视频链接:变量为什么必须初始化
7.如何定义变量?
数据类型 变量名=要赋的值;
等价于
数据类型 变量名;
变量名=要赋的值;
举例子:
int i=3; 等价于 int i; 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; j=5;
int i, j; i=j=5; 等价于 int i, j; i=5; j=5;
视频链接:如何定义变量
8.什么是进制?
十进制就是逢十进一
二进制就是逢二进一
生活中用到进制的例子
一周七天:七进制
一年十二个月:十二进制
一小时六十分钟:六十进制
电脑中的数据:二进制
进制转化
- 什么叫进制
- 进制就是逢几进一
- 我们说N进制实际就是指逢N进一
- 我们计算机只识别二进制
- 人类最习惯使用的是十进制
- 为了实际需要,我们又建立了八进制和十六进制
- C语言规定八进制前要加0(注意是0不是字母o),十六进制前要加0x或者0X,十进制什么都不加!
(一)什么叫n进制
- 十进制
- 十个基数,逢十进一
- 基数:0、1、2、3、4、5、6、7、8、9
- 二进制
- 二个基数,逢二进一
- 基数:0、1
- 2->10、3->11、4->100、5->101
- 八进制
- 八个基数,逢八进一
- 基数:0、1、2、3、4、5、6、7
- 8->10、、9->11、10->12
- 十六进制
- 十六个基数,逢十六进一
- 基数:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F或0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f
- 16->10、17->11、18->12、19->13
常用计数制对照表
| 十进制(D) | 二进制(B) | 八进制(O) | 十六进制(H) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 |
| 2 | 10 | 2 | 2 |
| 3 | 11 | 3 | 3 |
| 4 | 100 | 4 | 4 |
| 5 | 101 | 5 | 5 |
| 6 | 110 | 6 | 6 |
| 7 | 111 | 7 | 7 |
| 8 | 1000 | 10 | 8 |
| 9 | 1001 | 11 | 9 |
| 10 | 1010 | 12 | a |
| 11 | 1011 | 13 | b |
| 12 | 1100 | 14 | c |
| 13 | 1101 | 15 | d |
| 14 | 1110 | 16 | e |
| 15 | 1111 | 17 | f |
#include <stdio.h>
int main(void)
{
int i=88;
printf("i=%d\n", i);
/*
printf的用法
%d表示以十进制输出
%x或X表示以十六进制输出
%o表示以八进制输出
*/
return 0;
}
视频链接:进制转化
9.常量在C语言中是如何表示的
| 整数 | |
|---|---|
| 十进制 | 传统的写法 |
| 十六进制 | 前面加Ox或OX |
| 八进制 | 前面加0 |
| 注意八进制后面加的是数字0不是字母o |
+浮点数
传统的写法
float x=3.2;//传统
科学技术法
float x=3.2e3; //x的值是3200
float x=123.45e-2; //x的值是1.2345
+字符
单个字符用单引号括起来
'A'表示字符A,'AB'就错误了,是"AB"
字符串用双引号括起来
"A"正确,因为"A"代表了'A'、'\0'的组合
视频链接:常量在C语言的表示
10.常量以什么样的二进制代码储存在计算机中
整数是以补码的形式转化为二进制代码存储在计算机中的
实数是以IEEE754标准转化为二进制代码存储在计算机中的
字符的本质实际也是与整数的存储方式相同
视频链接:常量以什么样的二进制代码储存在计算机中
11.代码的规范化
#include <stdio.h>
int main(void)
{
if (asdasd(asda(asddsa)sd)sad) //代码要成对的敲,这样看着整齐,就比如该括号中的代码,左右都是对齐的
{
while (adsd(adsdsa)asad) //代码规范化便于自己观看,也便于别人观看,这样子也不容易出错
}
}
return 0;
程序的三部分
#include <stdio.h>
int main(void)
{
//定义变量
//对变量进行操作
//输出值
return 0;
就例如之前学习的一元二次方程代码中的一小段
x1 = (-b + sqrt(delta)) / (2a);这样给人看起来更清晰易懂
x1=(-b+sqrt(delta))/(2a);这样太紧凑,不好看
要学会适当空格
视频链接:代码规范化
12.什么是字节
字节就是存储数据的单位,并且是硬件所能访问的最小单位
1字节 = 8位
1K = 1024字节
1M = 1024k
1G = 1024M
视频链接:什么是字节
13.不同类型数据之间相互赋值的问题
int i = 45;
long j = 102345;
i = j;
printf("%ld %d\n", i, j);
float x = 6.6;
double y = 8.8;
printf("%f %lf\n, x, y");
由上图看出数字为2147483647运行出来的时候是一样的,而换成2147483648或者2147483649的时候运行出来的数字就不一样了,因为i放不下这么大的数字,就会溢出,出现错误
视频链接:不同类型数据之间相互赋值的问题
14.什么是ASCII
上图中printf中的d和c不同导致运行结果的不同
ASCII不是一个值,而是一种规定,
ASCII规定了不同的字符是使用哪个整数值去表示
它规定了
'A'--65
'B'--66
'a'--97
'b'--98
'0'--48
视频链接:什么是ASCII
15.字符的存储[字符本质上与整数的存储方式相同]
基本的输入和输出函数的用法
printf()输出,例如int i;i = 5;printf是把i变量输出;
scanf()输入,就是把键盘上输入的字符最终转化成一个数字
视频链接:printf和scanf简介
16.printf的用法详解
printf() --将变量的内容输出到显示器上
四种用法
- printf("字符串\n");
#include <stdio.h>
int mian(void)
{
printf("哈哈!\n"); //\n表示换行
return 0;
}
- printf("输出控制符", 输出参数);
#include <stdio.h>
int mian(void)
{
//printf("哈哈!\n"); //\n表示换行
int i = 10;
printf("%d\n", i); //i是输出参数,%d是输出控制符
//d是十进制
return 0;
}
- printf("输出控制符1 输出控制符2...",输出参数1,输出参数2...);
#include <stdio.h>
int mian(void)
{
int j = 3;
int k = 5;
printf("%d %d\n", j, k); //printf("%d\n", j, k);的话error输出控制符和输出参数的个数不匹配
return 0;
}
输出控制符和输出参数的个数必须一一对应
4. printf("输出控制符 非输出控制符", 输出参数);
输出控制符包含如下
%d -- int
%ld -- long int
%c -- char
%f -- float
%lf -- double
%x(或者%X后者%#X) -- int 或 long int 或 short int
printf中%X的用法
#include <stdio.h>
int mian(void)
{
int x = 100; //100是十进制
printf("%x\n", x); //输出结果是:2f
printf("%X\n", x); //输出结果是:2F
printf("%#X\n", x); //输出结果是:0x2F
printf("%#x\n", x); //输出结果是:0x2f
return 0;
}
%o -- 同%x
%s -- 字符串
为什么需要输出控制符
- 01组成的代码可以表示数据也可以表示指令
- 如果01组成的代码表示的是数据的话,那么同样的01代码组合以不同的输出格式输出就会有不同的输出结果
视频链接:printf的用法详解1 printf的用法详解2 printf为什么需要输出控制符
17.scanf用法
scanf()--通过键盘将数据输出到变量中
- scanf("输入控制符", 输入参数);
功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中 - scanf("非输入控制符 输入控制符", 输入参数);
功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中
非输入控制符必须原样输入
视频链接:scanf用法1 scanf用法2 scanf用法3 scanf用法4
Ubuntu pastebin
代码分享Ubuntu pastebin
名词翻译
| 中文 | 英文 | 中文 | 英文 |
|---|---|---|---|
| 整数 | integer | 变量 | variate |
| 字符 | character | 初始化 | initialize |
| 浮点数 | float | 十进制 | decimalism |
| 结构体 | structural body | 二进制 | binary system |
| 枚举 | enumeration | 十六进制 | hexadecimal |
| 联合 | unite | 打印 |
课后习题
3.10第四题
a. '\b' : 字符类型常量,''表示转义,'\b'表示退格
b. 1066 : 整数类型常量
c. 99.44 : 双精度浮点类型常量
d. 0XAA :无符号类型常量
e. 2.0e30 : 双精度浮点类型常量
3.10第六题
写出下列常量在声明中使用的数据类型和在printf()中对应的转换说明
| 常量 | 类型 | 转换说明(%转换字符) |
|---|---|---|
| 12 | int | %d |
| 0X3 | unsigned int | %#X |
| ‘C’ | char | %c |
| 2.34E07 | double | %e |
| ‘\040’ | char | %c |
| 7.0 | double | %f |
3.10第八题
假设程序的开头有下列声明
printf("The odds against the %d were %ld to 1.\n",imate,shot);
printf("A score of %f is not an %c grade.\n",log,grade).
3.11第一题
整数上溢
浮点数上溢
浮点数下溢