说明:
本篇记录的是自学C语言的相关过程记录,参考资料是B站郝斌老师的C语言自学教程。本人之前学过一点python,但是觉得C语言还是有必要学一下的。因为刚开始学C语言,所以本篇文章会不断更新。
因为是学习记录,所以条理可能并不是很清晰,后续感觉学的差不多的时候会重新整理一下。
P16. C语言编程基础知识
1. CPU、内存、硬盘、显卡、主板显示器之间的关系;
软件 –> 操作系统 –> 硬盘 –> 内存 –> CPU –> 声卡、显卡等处理。
主板的作用:将硬盘、内存等插在主板上,进行数据传输。
C语言文件运行步骤:源文件 –> compile(编译) –> build(链接) –> run(运行 .exe 文件)
2. 什么是数据类型;
基本类型数据:
整数
整型 -- `int` (4字节)
短整型 -- `short int` (2字节)
长整型 -- `long int` (8字节)
浮点数【实数】
单精度浮点数 – float
(4个字节)
双精度浮点数 – double
(8个字节)
字符
char
(1个字节)
单个字符用单引号括起来;
'A'
字符串用双引号括起来;
"AB"
C语言中没有字符串类型。
复合类型数据:
结构体
枚举
共用体
3. 什么是变量;
存放在内存里的某个空闲单元中的,程序终止之后,所占空间被释放出来。
变量本质就是内存中的一段存储空间。
4. 变量为啥要初始化;
初始化:就是赋值的意思。
# include <stdio.h>
int main(void)
{
int i;
printf("i = %d\n",i);
return 0;
}
如果没有初始化,那么这里的
i
就会是上一个内存空间释放后遗留的数值。当软件运行完毕之后,操作系统将回收该内存空间(注意:操作系统并不会清空该内存空间中遗留下来的数据)。只会更改该内存空间的状态标签。
5. 如何定义变量;
数据类型 变量名 = 要赋的值;
等价于
数据类型 变量名;
变量名 = 要赋的值;
6. 什么是进制;
n进制:逢n进一。
1011B 二进制1011
1357O 八进制1357
2049D 十进制2049
3FB9H 十六进制3FB9
十进制转r进制:
方法:除r取余,余数倒序排列。
7. 常量是以什么样的二进制代码存储在计算机中的;
整数以补码的形式转化为二进制代码存储在计算机中;
实数以IEEE754标准转化为二进制代码存储在计算机中的;
字符的本质也是与整数形式的存储方式相同 (A
–> ASCII码将字符转化为数字–> 将数字以补码形式存储);
关于浮点数的存储问题:
float
和double
都不能保证可以精确地存储一个小数。比如说:如何确定一个浮点型变量是否为0?
if (|x - 0.000001| <= 0.000001) 是零 else 不是零
- 为什么循环更新时的变量不能定义为浮点型?
因为浮点型时非准确存储。
8. 代码规范化;
林锐 《高质量C/C++编程》
注释占全部文档的1/3;括号要成对地敲;缩进;
C代码基本结构如下所示:
# include <stdio.h>
int main(void)
{
// 定义变量
// 对变量进行操作
// 输出值
return 0;
}
9. 什么是字节;
字节就是存储数据的单位,并且是硬件所能访问的最小单位。
计算机只能操作字节(byte),不能直接操作位(bit),需要通过位运算符来操控位(bit)。
1字节 = 8位
1K = 1024字节
1M = 1024K
1G = 1024M
10. 不同类型数据之间互相赋值的问题;
P30 (C/C++才有这个问题)
数据的溢出
# include <stdio.h>
int main(void)
{
int i = 2147483648;
printf("i = %d\n",i);
return 0;
}
如上所示:当 i= 2147483648
或者更大时,其输出会出错
输出 = -2147483648
为什么会出现这个情况?补码(暂时不考虑,后面会讲)
11. 什么是ASCII;
一些字符串操作经常犯的错误,如下所示:
# include <stdio.h>
int main(void)
{
char ch = 'A'; //(第5行)OK,等价于 char ch; ch = 'A';
//char ch = "AB"; // Error,因为"AB"是字符串,而 char只能定义字符。因此不能把字符串赋值给ch
//char ch = "A"; // Error,因为"A" 等价于 "A\0",因此"A"也是一个字符串,不能赋值给ch (和第6行错误一样)
//char ch = 'AB'; // Error,因为 'AB'的定义是错误的,单引号只能定义字符,不能定义字符串
//char ch = 'B'; // Error,不能和第5行同时存在,因为不能重复定义变量
ch = 'C'; // OK
printf("%c\n",ch);
return 0;
}
总结而言:
- 变量不能重复定义,但是可以被重复赋值;
char
只能用单引号定义字符变量,而不能定义字符串;- 单引号用来定义字符,双引号用来定义字符串(即使双引号内只有一个字母,如
"A"
,它也表示一个字符串,因为它后面接着一个"\0"
,也就是"A\0"
);
关于ASCII码,如下所示:
ASCII就是字符的编码方式:
'A' -- 65 'B' -- 66 'a' -- 97 '0' -- 48
字符 'A'
本身对应的ASCII码位65,因此在输出时用%d
直接输出了字符'A'
对应的ASCII码,即65。(如果是 %c
的话,则输出字符'A'
)
# include <stdio.h>
int main(void)
{
char ch = 'A';
printf("%d\n",ch);
return 0;
}
12. 字符的存储;
本质与整数的存储方式相同。
基本的输入和输出函数的用法
printf()
(重点)
– 将变量内容输出到屏幕;
四种用法:
printf("字符串\n");
printf("输出控制符\n", 输出参数);
(输出控制符是因为输出参数本身在计算机内部被转化成了二进制,因此需要指定其输出格式是二进制还是其他)printf("输出控制符1 输出控制符2,...", 输出参数1, 输出参数2, ...);
printf("输出控制符 非输出控制符", 输出参数);
输出控制符:
为啥需要输出控制符?
- 01组成的代码可以表示数据,也可以表示指令,需要输出控制符告诉它怎么去解读;
- 如果01组成的代码表示数据的话,那么同样的01代码以不同的输出格式会输出不同的结果;
C语言中的输出控制符如下:
%d -- int %ld -- long int %c -- char %f -- float %lf -- double %x (%X, %#x, %#X) // 输出16进制结果 -- int 或 long int 或 short int %o -- 同上 %s -- 字符串
关于16进制的%x
的相关用法:
# include <stdio.h>
int main(void)
{
int x = 47; // 47是十进制
printf("%x\n", x); // 输出结果是:2f
printf("%X\n", x); // 输出结果是:2F
printf("%#x\n", x); // 输出结果是:0x2f
printf("%#X\n", x); // 输出结果是:0X2F (推荐使用这个)
return 0;
}
scanf()
(非重点)
– 通过键盘将数据输入到变量中。
两种方法:
scanf("输入控制符", &输入参数)
– 将从键盘输入的字符转化为输入控制符所规定格式的数据,然后再存入以输入参数的值为地址的变量中。具体如下所示:
# include <stdio.h>
int main(void)
{
int x;
scanf("%d", &x); // &x 表示x的地址,&是一个取地址符
printf("x = %d\n", x);
return 0;
}
scanf("非输入控制符 输入控制符", &输入参数)
含有非输入控制符时,用键盘输入时必须加上非输入控制符(即非输入控制符必须原样输入)。
# include <stdio.h>
int main(void)
{
int x;
scanf("m%d", &x); // 比如m是非输入控制符,这里的 m%d 表示输入是必须是 m数字 (比如 m123),否则会报错
printf("x = %d\n", x);
return 0;
}
多个输入时:
# include <stdio.h>
int main(void)
{
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
printf("x = %d, y = %d, z = %d\n", x, y, z);
return 0;
}
如果想要根据提示进行键盘输入,可以在前面加上printf("字符串")
进行提示:
# include <stdio.h>
int main(void)
{
int x;
printf("m = "); //输入提示,根据该提示在键盘上进行输入。
scanf("%d", &x);
printf("x = %d\n", x);
return 0;
}
关于scanf()
的使用小结(P43 ):
scanf()
之前最好先使用printf()
提示用户以什么样的方式来输入;scanf()
中尽量不要使用非输入控制符,尤其是不要用\n
;- 应该编写代码对用户的非法输入做适当处理(非重点);
13. 运算符;
优先级:算数 > 关系 > 逻辑 > 赋值
算数运算符:
+ - * / %(取余数)
关于
/
的使用:
- 两个数都是
int
,则商是int
,如16/5 == 3
- 两个数中有一个为浮点型数据,则商也是浮点型,如
16/5.0 == 3.20000
关于
%
的使用:运算对象必须是整数,其余数的符号与被除数相同,如下所示:
13%3 == 1
13%-3 == 1
-13%2 == -1
关系运算符:
> >= < <= == !=
逻辑运算符:
||(或) &&(且) !(非)
真||真 -- 真
真||假 -- 真
假||真 -- 真
假||假 -- 假
真&&真 -- 真
真&&假 -- 假
假&&真 -- 假
假&&假 -- 假
!真 -- 假
!假 -- 真
注意:
&&
左边为假时,右边不执行。
# include <stdio.h>
int main(void)
{
int a = 4;
int m;
m = (1>2) && (a=7); // 左侧(1>2)是假,所以右侧的 a=7 不会执行。
printf("m = %d, a = %d\n", m, a);
return 0;
}
||
左边为真时,右边不执行。
# include <stdio.h>
int main()
{
int a = 4;
int m;
m = (3>2) || (a=7); // 左边为真时。右边不执行。
printf("m = %d, a = %d\n", m, a);
return 0;
}
关于逻辑运算符的举例:
注意:C语言中 “非零为真,零为假”。就是说只要数值不是0,那就是真;数值是0那就是假。(如下例子所示:)
# include <stdio.h>
int main(void)
{
int a = 1;
int b = 4;
int m;
m = (3>2) && (b=7); // 真&&真==真,3>2是真,b=7是真,所以m=1。
//m = (3>2) && (b=0); // 真&&假==假,3>2是真,b=0是假,所以m=0。
printf("m = %d, b = %d\n", m, b); // 真&&真==真,因此m=1。b在上一步被重新赋值,因此b=7.
return 0;
}
赋值运算符:
= += *= /= -=
++i == i=i+1 == i+=1
附录:一些额外的运算符知识
自增【或自减】
分类:
前自增 -- ++i
后自增 -- i++
异同:
相同点:最终都是 i 值加1
不同点:
前自增整体表达式的值是i加1之后的值;
后自增整体表达式的值是i加1之前的值;
如下举例所示:
# include <stdio.h>
int main(void)
{
int a, b, c, d;
a = b = 3;
c = a++; // 后自增
d = ++b; // 前自增
printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
return 0;
}
/* ------------------------------- 结果:a = 4, b = 4, c = 3, d = 4 ------------------------------- */
关于自增的使用建议:
- 尽量不考虑前自增和后自增的差别。
- 自增单独成一个语句,不要把它作为一个完整复合语句的一部分来使用(就是说:简单使用,不要和其他乱七八糟的语句混在一块使用)。
比如说:
int m = i++ + ++i + i + i++;
这种就是垃圾语句,不用去看。
三目运算符
格式:
A ? B : C
等价于:
if (A)
B;
else
C;
逗号表达式
格式:
A, B, C, D;
功能:
从左到右执行;
最终表达式的值是最后一项的值;
比如:
int i;
int j = 2;
i = (j++, ++j, j+2, j-3);
结果是:1
今天的文章C语言学习记录-Class3-编程基础知识分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/82010.html