刚刚毕业那会那时候是单片机兴起的时候,第一份工作就是做的51单片机的电路和编程,用的就是C语言,现在回头想想那时候真的是什么都不懂,但一上手就是直接动手做的方式还是不错的,在做的过程中学习和了解单片机的特性和功能,只是后来,辞职之后好长时间没有做了,现在又重新找了份工作,工作中又接触到了单片机和C语言的内容,所以自己又要重新再学习学习了。
【学习会】一起学习C语言之多年之后再拾起


昨天看完第一章,又想起了当年的hello world,那时候觉得自己要进入一个神奇的世界了,结果只是在大门口转了一圈,就出来了,现在回头看怎么都有熟悉的感觉,单片机大部分还是c语言,只有启动文件那部分是汇编,现在连启动文件也省了,就全是c语言了,所以打算好好重头好好再学习下

第一章:初识C语言
1-1:显示计算结果
#include<stdio.h>
int main(void)
{
printf(“%d”,15+37);
return(0);
}
格式化输出函数printf
%d:以十进制数显示
无格式化输出:
#include<stdio.h>
int main(void)
{
printf(“您好!我叫柴田望洋。\n”);
return(0);
}
转义字符\n:换行操作
\a:响铃
#include<stdio.h>
int main(void)
{
printf(“您好!\a \a \a \n”);
return(0);
}
1-2变量
常量和变量
声明变量
声明多个变量
赋值
1-3输入与显示
通过键盘进行输入
#include<stdio.h>
int main(void)
{
int no;
printf(“请输入一个整数:”);
scanf(“%d”,&no);
printf(“您输入的是%d。\n”,no);
return(0);
}
格式化输入函数scanf
乘法运算
输出函数puts:顺序输出 作为实参的字符串,并在结尾换行。
printf(“ABC\n”)与puts(“ABC”)等同

第2章 运算和数据类型
2-1运算
四则运算
#include<stdio.h>
int main(void)
{
int vx,vy;
puts(“请输入两个整数。”);
printf(“整数vx:”);scanf(“%d”,&vx);
printf(“整数vy:”);scanf(“%d”,&vy);
printf(“vx+vy=%d\n”,vx+vy);
printf(“vx-vy=%d\n”,vx-vy);
printf(“vx*vy=%d\n”,vx*vy);
printf(“vx/vy=%d\n”,vx/vy);
printf(“vx%%vy=%d\n”,vx%vy);
return(0);
}
这里需要注意的是求余数那里用到的%%,是因为%有转化功能,所以需要输出%这个符号的时候需要多写一个。
这段程序里涉及到了运算符+、 - 、* 、/ 、%;然后vx 、vy这两个操作数;后面给个例子取整数最后一位数字如下:
#include<stdio.h>
int main(void)
{
int no;
printf(“请输入一个整数:”);
scanf(“%d”,&no);
printf(“最后一位是%d。\n”,no%10);
return(0);
}
其中需要注意的是%运算,这是计算余数,但有时候规则不同,结果也不同。
单目运算符
取反 –
赋值运算符 =;表达式和赋值表达式

2-2数据类型
求平均值
#include<stdio.h>
int main(void)
{
int na,nb;
puts(“请输入两个整数。”);
printf(“整数A:”);scanf(“%d”,&na);
printf(“整数B:”);scanf(“%d”,&nb);
printf(“它们的平均值是%d。\n”,(na+nb)/2);
return(0);
}
数据类型
int 类型和double 类型
#include<stdio.h>
int main(void)
{
int nx;
double dx;
nv=9.99;
dx=9.99;
printf(“int 型变量nx的值:%d\n”,nx);
printf(“ nx/2:%d\n”,nx/2);
printf(“double 型变量dx的值:%f\n”,dx);
printf(“ dx/2.0:%f \n”,dx/2.0);
return(0);
}
注意:printf函数输出double型值,转换说明用了%f
数据类型和对象
int 只能存整数
double可以存实数
整数常量和浮点数常量
数据类型和运算
类型转换
转换说明:这里我觉得才是最重要的
#include<stdio.h>
int main(void)
{
int na,nb,nc;
int sum;
double ave;
puts(“请输入三个整数。”);
printf(“整数A:”);scanf(“%d”,&na);
printf(“整数B:”);scanf(“%d”,&nb);
printf(“整数C:”);scanf(“%d”,&nc);
sum=na+nb+nc;
ave=(double)sum/3;
printf(“它们的合计值%5d。\n”,sum);
printf(“它们的平均值%5.1f。\n”,ave);
return(0);
}
这里的%5:显示至少5位的十进制整数
这里的%5.1f:显示至少5位的浮点数,但小数点后只显示1位
举例:%09.9f:
a.0表示前面有空位用0补齐位数
b.9表示最少显示宽度为9位,不设定或者超过位数就根据数值显示必要位数,如果设定“-”,数据会显示左对齐,否则右对齐
c.精度:指定显示的最小位数,如果不指定,则整数的时候默认为1,浮点数的时候默认为6
d.转换说明符 d 显示十进制的int型整数 f 显示十进制的double型浮点数
举例如下:
#include<stdio.h>
int main(void)
{ //运行结果
printf(“[%d]\n”, 123); // [123]
printf(“[%.4d]\n”, 123); // [0123]
printf(“[%4d]\n”, 123); // [ 123]
printf(“[%04d]\n”, 123); // [0123]
printf(“[%-4d]\n”, 123); // [123 ]
printf(“[%d]\n”, 12345); // [12345]
printf(“[%.3d]\n”, 12345); // [12345]
printf(“[%3d]\n”, 12345); // [12345]
printf(“[%03d]\n”, 12345); // [12345]
printf(“[%-3d]\n”, 12345); // [12345]
printf(“[%f]\n”, 123.13); // [123.130000]
printf(“[%.1f]\n”, 123.13); // [123.1]
printf(“[%6.1f]\n”, 123.13); // [ 123.1]
printf(“[%f]\n”, 123.13); // [123.130000]
printf(“[%.1f]\n”, 123.13); // [123.1]
printf(“[%4.1f]\n”, 123.13); // [123.1]
return(0);
}

第3章 分支结构程序
3-1 if语句
例:
#include<stdio.h>
int main(void)
{
int vx;
printf(“请输入一个整数:”);
scanf(“%d”,&vx);
if(vx%5)
puts(“输入的整数不能被5整除。”)
return(0);
}
解释if后括号里只有余数不为0,才执行后面puts语句。
例:奇数的判断
#include<stdio.h>
int main(void)
{
int no;
printf(“请输入一个整数:”);
scanf(“%d”,&no);
if(no%2)
puts(“输入的整数是奇数。”)
return(0);
}
if语句(2):if else
#include<stdio.h>
int main(void)
{
int vx;
printf(“请输入一个整数:”);
scanf(“%d”,&vx);
if(vx%5)
puts(“输入的整数不能被5整除。”)
else
puts(“输入的整数能被5整除。”)
return(0);
}
奇数和偶数
#include<stdio.h>
int main(void)
{
int no;
printf(“请输入一个整数:”);
scanf(“%d”,&no);
if(no%2)
puts(“该整数是奇数。”)
else
puts(“该整数是偶数。”)
return(0);
}
判断:指的是if后面括号里的值
非0的判断:
#include<stdio.h>
int main(void)
{
int num;
printf(“请输入一个整数:”);
scanf(“%d”,#
if(num)
puts(“该整数不是0。”)
else
puts(“该整数是0。”)
return(0);
}
相等运算符:==
不等运算符:!=
关系运算符:<、>、< = 、>=
嵌套的if语句:if else if else
计算较大值:
计算三个数的最大值:
条件运算符:属于三目运算符 a?b:c(如果a不为0,则结果是b的值,否则结果是c的值。)
差值计算:(n1-n2)?n1-n2:n2=n1
复合语句(程序块):
判断季节:
逻辑运算符:
&& 逻辑与 || 逻辑或

3-2switch语句
句型:switch(){case ;}
例:
#include<stdio.h>
int main(void)
{ int num;
printf(“请输入一个整数:”);
scanf(“%d”,&num);
switch(num%3){
case 0: puts(“该数能被3整除。”);break;
case 1: puts(“该数除以3的余数是1。”);break;
case 2: puts(“该数除以3的余数是2。”);break;
}
return(0);
}
其中,执行break语句会跳出switch语句。
#include<stdio.h>
int main(void)
{ int sw;
printf(“请输入一个整数:”);
scanf(“%d”,&sw);
switch(sw){
case 1: puts(“A”); puts(“B”);break;
case 2: puts(“C”);break;
case 5: puts(“D”);break;
case 6:
case 7: puts(“E”);break;
default: puts(“F”);break;
}
return(0);
}
default:当控制表达式的值与任何一个case后都不一致就跳转到此执行。
switch和if语句
选择语句:实现程序流程的选择性分支

第4章 程序的循环控制
4-1 do语句
do ……while(条件);
#include<stdio.h>
int main(void)
{
int cont;
do {
int no;
printf(“请输入一个整数:”);
scanf(“%d”,&no);
if(no%2)
puts(“这个整数是奇数。”);
else
puts(“这个整数是偶数。”);
printf(“要重复一次吗?【Yes…0 /No…9】:”);
scanf(“%d”,&cont);
} while(cont==0);
return(0);
}
解释:即使读取到的不是9,也会结束循环,因此只有读取到0,才继续循环。
复合语句(程序块)中的声明
逻辑非运算符
!cont与cont==0含义相同
逆向显示整数值
#include<stdio.h>
int main(void)
{
int num;
do{
printf(“请输入一个非负整数:”);
scanf(“%d”,&num);
if(num<0);
puts(“请不要输入负整数。”);
}while(num<0);
printf(“该整数逆向显示的结果是:”);
do{
printf(“%d”,num%10);
num=num/10;
}while(num>0);
puts(“。”);
return(0);
}
计算整数的位数
#include<stdio.h>
int main(void)
{
int num;
int dig;
do{
printf(“请输入一个非负整数:”);
scanf(“%d”,&num);
if(num<0);
puts(“\a请不要输入负整数。”);
}while(num<0);
dig=0;
do{
num=num/10;
dig=dig+1;
}while(num>0);
printf(“该整数的位数是%d。\n”,dig);
return(0);
}
初始化
#include<stdio.h>
int main(void)
{
int no=1;
int sum=0;
do{
sum=sum+no;
no=no+1;
}while(no<=5);
printf(“1到5的合计值是%d。\n”,sum);
return(0);
}
复合赋值运算符+=
#include<stdio.h>
int main(void)
{
int no=1;
int sum=0;
do{
sum+=no;
no+=1;
}while(no<=5);
printf(“1到5的合计值是%d。\n”,sum);
return(0);
}
对于*,/,%,+,-,<<,>>,&,^,|都有符合赋值运算
后置递增运算符合后置递减运算符
即:a++ 操作数a增加1
a-- 操作数a减少1

4-2 while语句
#include<stdio.h>
int main(void)
{
int no;
printf(“请输入一个整数:”);
scanf(“%d”,&no);
while(no>=0){
printf(“%d”,no);
no--;
}
putchar(‘\n’);
return(0);
}
字符常量
putchar
用递减运算符简化程序
printf(“%d”,no);no--;可以简化为printf(“%d”,no--);
数据递增
#include<stdio.h>
int main(void)
{
int i,no;
printf(“请输入一个正整数:”);
scanf(“%d”,&no);
i=0;
while(i<=no)
printf(“%d”,i++);
putchar(‘\n’);
return(0);
}
限定次数的循环操作
#include<stdio.h>
int main(void)
{
int no;
printf(“请输入一个正整数:”);
scanf(“%d”,&no);
while(no-- > 0)
putchar(‘*’);
putchar(‘\n’);
return(0);
}
前置递增运算符和前置递减运算符
++a 该表达式的值是增加后的值
--a 该表达式的值是减少后的值

4-3for语句
#include<stdio.h>
int main(void)
{
int i,no;
printf(“请输入一个整数:”);
scanf(“%d”,i);
for(i=0;i<=no;i++)
printf(“%d”,i);
putchar(‘\n’);
return(0);
}
备注:for循环是我个人用的最多的语句,所以应该永远都不会忘了
do while for 统称为循环语句
固定次数的循环
#include<stdio.h>
int main(void)
{
int i,no;
printf(“请输入一个整数:”);
scanf(“%d”,i);
for(i=1;i<=no;i++)
putchar(‘*’);
putchar(‘\n’);
return(0);
}
例:输入几个数求合计值和平均值
#include<stdio.h>
int main(void)
{
int i;
int sum=0;
int num,tmp;
printf(“输入多少个整数:”);
scanf(“%d”,num);
for(i=0;i<=num;i++)
{
printf(“No.%d”,i+1);
scanf(“%d”,&tmp);
sum+=tmp;
}
printf(“合计值:%d\n”,sum);
printf(“平均值:%.2f\n”,(double)sum/num);
return(0);
}
4-4多重循环
九九乘法表
#include<stdio.h>
int main(void)
{
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
printf(“%3d”,i*j);
putchar(‘\n’);
}
return(0);
}
多重循环
#include<stdio.h>
int main(void)
{
int cont;
do{
int num,i;
do{
printf(“请输入一个非负整数:”);
scanf(“%d”,&num);
if(num<0)
puts(“\a请不要输入负整数。”);
} while(num<0);
for(i=1;i<=num;i++)
putchar(‘*’);
putchar(‘\n’);
printf(“是否继续执行?【Yes…0/No…9】:”);
scanf(“%d”,&cont);
}while(!cont);
return(0);
}
长方形
#include<stdio.h>
int main(void)
{
int i,j;
int width,height;
puts(“让我们来描绘一个长方形。”);
printf(“宽:”); sanf(“%d”,&width);
printf(“高:”); sanf(“%d”,&height);
for(i=1;i<=height;i++){
for(j=1;j<=width;j++)
putchar(‘*’);
putchar(‘\n’);
}
return(0);
}
直角三角形1
#include<stdio.h>
int main(void)
{
int i,j,ln;
printf(“三角形有几层:”);
scanf(“%d”,&ln);
for(i=1;i<=ln;i++){
for(j=1;j<=i;j++)
putchar(‘*’);
putchar(‘\n’);
}
return(0);
}
直角三角形2
#include<stdio.h>
int main(void)
{
int i,j,ln;
printf(“三角形有几层:”);
scanf(“%d”,&ln);
for(i=1;i<=ln;i++){
for(j=1;j<=ln-i;j++)
putchar(‘ ’);
for(j=1;j<= i;j++)
putchar(‘*’);
putchar(‘\n’);
}
return(0);
}
4-5程序的组成元素和格式
关键字:32个
auto break case char const contunue
default do double else enum extern
float for goto if int long
register return short signed sizeof long
struct swith tupedef union unsigned void
volatile while
标识符
分隔符
运算符
常量和字符串常量
自由的书写格式
连接相邻的字符串常量
缩进
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
汽车+汽车电子电阻解释与分析被打赏5分 | |
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 |