万丈高楼平地起,打好基础不费力
写在前面:本文主要是结合郝斌老师的教程所写。如有不恰当的地方,欢迎大家指点批评。
铁子是否单片机之路遇到阻塞了?
C语言——通往有钱人的阶梯
不说胡话
加油 奥利给
C语言预备知识
- CPU、内存条、硬盘、显卡、主板、显示器之间的关系?
win98后CPU不能直接操作硬盘中的数据。
详细阐述上述之间的关系 - 简单程序如何运行起来?
vc++ 6.0 中的compile+build生成一个.exe文件
!调用CPU运行.exe文件
- 数据类型?
数据存储前对数据进行分类:
int(整数4字节) ----- short int(短整型2字节) ----- long int(长整型8字节)
float(单精度浮点数4字节) ------ double(双精度浮点数8字节)
char(字符1字节)
复合数据类型:结构体、 枚举、 共用体 - 变量?
内存中的一些存储空间 - 内存条、软件vc++ 6.0 、操作系统的关系?
编程软件向操作系统发出请求,操作系统的内存条分配空闲空间,变量与空间的地址一一对应 - 变量的初始化?
变量赋初值,没有赋初值时会有填充值: -858993460
return; 作用相当于break;
return 0; 用于返回非void的函数的值。 - 定义变量?
数据类型 变量名 = 值;
int i = 3;
int i , j;
i = j = 5; - 进制?
X进制:逢X进一 - 常量?
数的表示:整数、浮点、科学计数。字符:“AB”,“A”==‘A’ + '\0’
字符常量:单引号’ ’ 字符串常量:双引号" " - 常量以什么样的二进制代码存储在计算机中?
字符、整数以补码的方式存储在计算机中
实数以IEEE754标准转化为二进制代码存储在计算机中
科学计数与IEEE754渊源 - 字节?
存储数据的单位,并且是硬件所能访问的最小单位
1byte = 8 bit
1K = 1024 byte
1M = 1024K
1G = 1024M - 不同数据类型间的赋值?
整型数据
- 占据范围大的赋值给占据字节小的
int a = 2147483648; // 超出了int 定义的范围 程序会报错输出
int b;
printf("a = %d\n", a); // %d 上限范围小于a的值
b = a;
printf("b = %u\n", b); // %u 无符号类型 范围更大
/*
在vc++6.0中运行结果为:
a = -2147483648
b = 2147483648
*/
- 占据范围小的赋值给占据字节大的
# include <stdio.h>
int main(void)
{
char a = 255;
short b; // char 占据1*8位,short 占据2*8位 高位用1填充
b = a;
printf("b = %d\n", b);
return 0;
}
/*
在vc++6.0中运行结果为:
b = -1
*/
b = -1的来历
13. ASCII?
字符与整数的对应法则
A—65 a------97
14. 字符的存储?
字符与整数的存储方式一致
15. 输入输出函数?
printf() 用法
/*
2020年12月31日
printf的用方法简介
*/
# include <stdio.h>
int main(void) // 入口函数是int main 必须有返回值 return 0;
{
int i = 169;
printf("i = %d\n", i);
printf("i = %o\n", i);
printf("i = %x\n", i);
printf("i = %X\n", i);
printf("i = %#X\n", i); //推荐
//printf("Hello World!\n");
return 0; // 返回值
}
/*
--------------------------------------
在VC++6.0中测试结果:
i = 169
i = 251
i = a9
i = A9
i = 0XA9
Hello World!
--------------------------------------
*/
输出控制符意义?
~ 01 组成的代码既可以作为数据也可以作为指令
~输出控制符不同,代表的数据不同
scanf()用法
一个输入
/*
2020年12月31日
scanf一个输入的用法
*/
# include <stdio.h>
int main(void)
{
int i;
scanf("%d", &i); //输入数据以字符样式存储,输出控制符将字符转为十进制整数
printf("i = %d\n", i);
return 0;
}
/*
------------------------------
在VC++6.0中运行的结果:
12
i = 12
------------------------------
*/
多个输入
/*
2020年12月31日
scanf多个输入的用法
*/
# include <stdio.h>
int main(void)
{
int i, j , k;
printf("请输入三个数字中间用空格分隔!\n");
scanf("%d %d %d", &i, &j, &k); //非输出控制符原样输出
printf("i = %d, j = %d, k = %d\n", i, j, k);
return 0;
}
/*
-------------------------------------------
在VC++6.0中运行的结果:
请输入三个数字中间用空格分隔!
15 6 8
i = 15, j = 6, k = 8
-------------------------------------------
*/
防止用户输错数据
/*
2020年12月31日
getchar()用于防止用户输错数据
*/
# 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;
}
/*
---------------------------------
在VC++6.0中运行结果:
456
i = 456
95
j = 95
---------------------------------
*/
- 运算符
算数运算符: +、 - 、 、 / 、 %
关系运算符: > 、< 、 >= 、 <=、 !=(不等) 、==(等于)
逻辑运算符:&&(与)、||(或)、!(非)
赋值运算符: = 、 += 、 -=
优先级别:算数 > 关系 > 逻辑 > 赋值*
~ 除法(被除数、除数只要有一个为浮点数则商为浮点数):
16/5 == 3
16/5.0 == 3.20000
-16/5 == -3
-16/-5 == 3
~取余(运算对象必须为整数,符号与被除数相同):
13%3 == 1
13%-3 == 1
-13%3 == -1
~&&:有假即假
||:一真则真
三目运算符 A ? B : C(A成立执行B否则执行C)
逗号表达式 A, B, C, D (执行最后一个D)
/*
2021年1月5日
逗号运算符
*/
# include <stdio.h>
int main(void)
{
int i;
int j = 5;
i = (j++, ++j, j+2, j-3); // j++,++j都完成了j=j+1操作,j+2 != (j+=2)所以j+2是临时将j+2但不赋值给j
printf("i = %d\n", i);
return 0;
}
/*
---------------------------------------------
在VC++6.0中运行结果为:
i = 4
过程:j++、++j后j变为7 输出最后一个j-3则为4
---------------------------------------------
*/
&&前面为假后面不执行,||前面为真后面不需要执行
/*
2020年12月31日
&&的短路特性
*/
# include <stdio.h>
int main(void)
{
int i = 2;
int j = 5;
int m;
m = (1>2) && (j = 6); //前面的表达式错误不在运行j = 6;
printf("m = %d, j = %d\n", m, j);
return 0;
}
/*
----------------------------------------
在vc++6.0中运行结果:
m = 0, j = 5
----------------------------------------
*/
例1:一元二次方程
// 一元二次方程
# include <stdio.h>
# include <math.h>
int main(void)
{
//系数
int a = 1;
int b = 9;
int c = 3;
double delta; // b*b - 4*a*c
double x1;
double x2;
delta = b*b - 4*a*c;
if(delta>0)
{
x1 = (-b + sqrt(delta)) / (2*a);
x2 = (-b - sqrt(delta)) / (2*a);
printf("该一元二次方程有两个解, x1=%f,x2=%f\n", x1, x2);
}
else if (delta == 0)
{
x1 = (-b) / (2*a);
x2 = x1;
printf("该一元二次方程有唯一解, x1=x2=%f\n", x1, x2);
}
else
{
printf("该一元二次方程无解\n");
}
return 0;
}
例2:任意半径求圆的周长
/*
2020年12月31日09:21:57
目的:计算圆的周长
*/
# include <stdio.h>
# include <math.h>
# define PI 3.14 //宏定义
int main(void)
{
int radius;
float circum;
scanf("%d", &radius);
circum = 2 * PI * radius;
printf("变量radius地址是%d\n", &radius); //&取地址
printf("半径开方值是%f\n", sqrt(radius));
printf("半径是%d, 周长是%.2f\n", radius, circum); //%.2f取小数点后2位,默认取小数点后6位
return 0;
}
/*
------------------------------------
在VC++6.0中运行结果是:
5
变量radius地址是1703724
半径开方值是2.236068
半径是5, 周长是31.40
------------------------------------
*/