转计算机架构01-C语言学习01
计划以后转到计算机架构方向上去,系统学习一遍C语言基础,参考教材-C程序设计语言(机械工业出版社的计算机黑书),并且结合B站教程来学习
1.win安装编译器与配置vscode
参考
【C语言环境设置 | Windows安装编译器和VS Code】 https://www.bilibili.com/video/BV112z3YUEmU/?share_source=copy_web&vd_source=8541a01b50589c05f56714cfb5fda7ff
注意别下载其他C++插件,不然vscode里的PATH很可能被其他插件的某些功能覆盖掉,然后编译不了;如果提前下载了vscode,重启插件就能解决编译不了的问题。

2.C语言基础语法
2.1 参考并复现
【《C程序设计语言》-序言部分:先把C语言简单用起来】 https://www.bilibili.com/video/BV1nC4y1e77d/?share_source=copy_web&vd_source=8541a01b50589c05f56714cfb5fda7ff
第一章 快速上手
温度转换-变量与算术表达式
#include <stdio.h>
int main(){
float fahr,celsius;
int lower,upper,step;
lower=0;upper=300;step=20;
fahr=lower;
while(fahr<=upper){
celsius=(5.0/9) * (fahr-32);
printf("%3.0f\t%6.1f\n",fahr,celsius);
fahr=fahr+step;
}
return 0;
}
for语句
#include <stdio.h>
int main(){
float fahr;
for(fahr=0.0;fahr<=300.0;fahr=fahr+20){
printf("%3f\t%6.1f\n",fahr,(5.0/9)*(fahr-32));
}
return 0;
}
符号常量 #define 一般大写
#include <stdio.h>
#define STEP 20
#define UPPER 300
#define LOWER 0
int main(){
float fahr;
for(fahr=LOWER;fahr<=UPPER;fahr=fahr+STEP){
printf("%3f\t%6.1f\n",fahr,(5.0/9)*(fahr-32));
}
return 0;
}
字符输入输出
#include <stdio.h>
int main(){
int c;
c=getchar();
while (c!=EOF)
{
/* code */
putchar(c);c=getchar();
}
return 0;
}
getchar()会逐个读取输入的字符,当输入的字符流结束时,getchar()会返回符号常量EOF;当未输入时,程序会停在getchar()处等待输入。一次输入很多字符,getchar()会依次读取。
数组统计 字符与数字 个数
注意:在算术表达式里,char类型的变量常量会被提升为int类型。(只是在算术中啊,而且也只是暂时提升)
还有单字符用单引号,字符串用双引号
#include <stdio.h>
int main(){
int c,nwhite,nother,i;
int ndigit[10]; /*定义时的10是指的元素个数*/
for(i=0;i<=9;++i){ndigit[i] = 0;}/*初始化数组*/
nwhite=nother=0;
while ((c=getchar())!=EOF)
{ /*char和int在算术运算时都按int*/
if(c>='0' && c<='9'){++ndigit[c-'0'];}
else if (c == ' ' || c=='\t' || c=='\n')
{
++nwhite;
}
else
++nother;
}
for(i=0;i<=9;++i){printf("%d\t",ndigit[i]);}
printf("%d\t",nwhite);
printf("%d\t",nother);
return 0;
}
EOF在win上用ctrl+Z+enter触发,表示文本流结束。
结果如图:
字符数组
C里好像没有字符串,但是有字符数组?注意:函数形参传入 数组 改变的是真正的那个数组的值。
接下来要输入一组文本行,并且打印最长文本行
#include <stdio.h>
int getaline(char s[]);
void linecopy(char a[],char b[]);
int main(){
int len; /*当前行长度*/
int maxlen; /*最大的行长度*/
char line[1000]; /*当前行内容*/
char maxline[1000]; /*最长行的内容*/
maxlen = 0;
while ((len=getaline(line))>0)
{
if (len>maxlen)
{
maxlen = len;
linecopy(maxline,line);
}
}
if (maxlen>0)
{
printf("%s\t%d\n",maxline,maxlen);
}
return 0;
}
int getaline(char s[]){
int c,i;
for ( i = 0; (i < 999)&&((c=getchar())!=EOF)&&(c!='\n'); ++i)
{ s[i]=c;}
if (c=='\n')
{
s[i]=c;++i;
}
s[i]='\0';
return i;
}
void linecopy(char a[],char b[]){
int i=0;
while ((a[i]=b[i])!='\0')
{
++i;
}
}
结果:

第2章 类型、运算符与表达式
2.1基本数据类型
数据类型: int、char、float、double
整型限定符:short、long(此时可省略int)
类型限定符:signed、unsigned(用于char或any整型)
就是说浮点的不能喽?(除了long double)
2.2枚举类型
enum MANBA {A=0,B}
不赋值的话,默认按0,1,2......;部分赋值默认递增。
2.3 const
const修饰符表示变量不能被修改,修饰数组的话,函数调用也不能改。
2.4自动转换类型
自动类型转换:一般都由简单变复杂,但是float不能变成double;虽然由简单变复杂,但是在涉及到有无符号时,变复杂意味着往前加0,有符号数的意义和大小也因此可能会变。
第3章 控制流
略
第4章 函数与程序结构
嵌入式基础里学过一些,略
static 修饰 静态变量:
作用于外部变量使其他文件的函数不能访问;
作用于函数使其他文件的函数不能调用;
作用域函数内的变量使它一直存在,仅受一次初始化。
条件包含编译预处理:
一般用在头文件:
#ifndef XXX_H
#define XXX_H
#endif
第5章 指针与数组
*:从对应地址中取值
&:对变量取地址
数组名a/a[]是一个地址(指针),a[i]是具体值
二维数组、指针的数组、指向数组的指针

第6章 结构
同嵌入式
更多推荐
所有评论(0)