计划以后转到计算机架构方向上去,系统学习一遍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章 结构

同嵌入式

更多推荐