C语言学习笔记

1. 前言

本篇主要记录个人对C语言基本语法学习的思考和总结,着重于对C语言编程实质的思考,没有过多示例代码。
将在另外一篇博客中进行基本知识点的编程训练。

本文不定期更新和修正。最后更新日期:2021-07-31 17:55:13

主要从以下思路来学习:

<1>.数据表达
        |-> 量(常量和变量)
        |-> 数据类型
        |-> 数据结构
<2>.控制结构
        |-> 顺序结构
        |-> 选择结构
        |-> 循环结构
<3>.模块编程
        |-> 表达式和返回值
        |-> 语句
        |-> 函数
        |-> 头文件

2. 数据表达

2.1 量

量可以归纳为:常量和变量。

常量

常量就是我们说的字面量,直接书写在编程语言里面的对象。比如printf("数字:100 ")
"数字",就是字面量字符常量;"100",就是字面量数字常量;":",就是字面量特殊字符常量

变量

C语言中,变量是内存区域的名称。也可以理解变量就是内存(或者内存的标签)
如定义变量的语句int a = 100;,其执行的结果就是向编译器申请一片大小为int型的,名称为a内存区域,区域初始指为整型数字100。

操作系统是内存的管理者。应用程序申请内存后,由操作系统来分配。C语言程序因为需要编译器来编译,生成可执行文件。因此C语言语句的执行,实际是由编译器代理程序来向操作系统申请内存。
编译器在编译int a = 100;这句时,通过语法分析确定该语句要做的操作,编译为目标文件时告知操作系统要做的操作。

程序逻辑通过内存区域名称来使用内存内部的数据。内存区域除了有名称,还有地址,即内存地址。程序也可以通过地址操作符来使用内存内部的数据。
内存地址就是常说的指针。指针的操作符有:
*:解引地址。* 后面跟内存地址就是获取该地址处的内存值
&:取地址符。&后面跟变量,就是获取该变量的地址(指针)

总结一下:

  1. 内存的名称——变量
  2. 内存的地址——指针
  3. 内存的内容——值

示例代码:

# include<stdio.h>
int main(){
    int a = 100;
    printf("%d
",a); //打印内存(变量)a的值
    printf("%d
",&a); //打印内存(变量)a的地址
    scanf("%d",&a); //输入一个值,通过内存(变量)a地址存入内存(变量)a区域
    printf("%d
",a); //打印内存(变量)a的值
    printf("%d
",&a); //打印内存(变量)a的地址
    return 0;
}

代码运行结果:

变量的值:100
变量的地址:-900142388
200
变量的值:200
变量的地址:-900142388

2.2 数据类型

数据类型是任何编程语言所具备的基本元素。
程序就是通过数据来实现不同的逻辑。一种比较经典的说法:程序=数据+算法。
因此编程语言为了解决实际问题,会根据现实世界万物表现和运行的方式,内置不同的数据类型。

数据类型可以分为静态单一数据类型,静态组合数据类型,动态数据类型。动态数据类型已经是数据结构的范畴。

数字与字符
观察单一数据类型可以发现,组成不同类型数据的元素,包括数字与字符。
数字不仅有整数,浮点数,还有有实数和虚数。
整数因为计算机支持和存放的方式,分为正负和不同的大小。
浮点数目因为计算机存放数据的位数分为单精度和双精度。

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main(){
}

数组
单一的数据类型不多。假如将数据混合,便构成了数据类型。
比如C语言静态数据类型,一维数组或者多维数组。

结构体
结构体则是包含了不同基本数据类型的数据类型。

共同体

3. 控制结构

控制结构是依据条件的程序运行方式,只有当【条件成立】时,才执行条件下的语句。

3.1 顺序结构

顺序执行就是【无条件】的情况。无论上一条语句执行做了什么,下一条语句继续执行。

一般程序是顺序执行的。C语言程序从main函数开始。main函数是一句一句执行。

示例程序:

#include <stdio.h>

void hello(){
    printf("hello,world.I'm function:hello
");
}

int main(){
    printf("hello,world.I'm function:main
");
    hello();
    return 0;
}

代码执行结果:

hello,world.I am function:main
hello,world.I am function:hello

上面这段代码,函数hello定义在主函数main前面,编译之后程序的执行顺序是先执行main,main函数调用hello时,才会被执行

3.2 选择结构

现实生活中,一往之前的情况只是众多情况最常见的,但是不唯一的。我们总会被很多条件限制,在符合这些条件时,才能够完成很多工作。
而C语言归纳了这种现象,通过选择结构和循环结构,完成程序的跳转。

3.2.1 条件结构

3.2.1.1 if...else...语句

由if引导的条件判断结构既简单也复杂。它是根据【条件的成立与否】来判断【语句执行与否】。
而条件则有可能是单一的条件,也有可能是多个条件。
条件的判断最终会产生一个真值(true或者false),if根据这个真值来确认是否执行条件下的语句模块。
语法结构如下:

if (条件判断的结果)
    {
        判断结果为真时,要执行的语句模块
    }
else
    {
       判断结果为假时,要执行的语句模块 
    }

由上面的基本语法结构,衍生出其他语法结构,包括条件的嵌套。

情景1:特例处理

if (单一或者组合条件判断的结果为真)
    {
        判断结果为真时,要执行的语句模块
    }
//这种适用于处理特殊情况

情景2:正反面

if (单一或者组合条件判断的结果为真)
    {
        判断结果为真时,要执行的语句模块
    }
else
    {
        判断结果为假时,要执行的语句模块
    }
//这种适用于仅仅存在2种互斥情况的场景

情景3:多种选择[区别于switch]

if (单一或者组合条件判断的结果为真)
    {
        判断结果为真时,要执行的语句模块
    }
else if (单一或者组合条件判断的结果为真)
    {
        判断结果为真时,要执行的语句模块
    }
else
    {
        上面条件均判断为假,要执行的语句模块
    }
//适用于多个选择且互斥的场景

情景4:大条件下的小条件[嵌套]

if (单一或者组合条件判断的结果为真)
    {
        //情景1
        if (单一或者组合的判断结果为真)
        {
            要执行的语句模块
        }
       //情景2
        if (单一或者组合条件判断的结果为真) 
            {
            要执行的语句模块
            }
        else
            {
                要执行的语句模块
            }
        //情景3
        if (单一或者组合条件判断的结果为真)
            {
                要执行的语句模块
            }
        else if (单一或者组合条件判断的结果为真)
            {
                要执行的语句模块
            }
        else
            {
                结果为假时,要执行的语句模块
            }
    }

4. 模块编程

模块化编程在任何一种编程语言都存在。因为任何一门编程语言,必然会存在语句(指令)。
以某种形式(如空格,分号,换行符,缩进,花括号等)分开的语句,实际上就是编译器或者解释器能够编译或者解析的基本单位。

4.1 语句

运算符构成表达式。不同的运算符构成不同的表达式。

  • 算术运算
  • 关系运算
  • 逻辑运算
  • 赋值运算
  • 位运算

表达式与语句分割形式,构成语句,是编译器或者解释器解析的单元。

4.1 表达式与返回值

【 欢迎交流探讨!邮箱:yunweinote@126.com】
原文地址:https://www.cnblogs.com/liwanliangblog/p/15084683.html