zoukankan      html  css  js  c++  java
  • 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】
  • 相关阅读:
    Xen, Linux and udev
    xend的调试方法
    xenstored为什么不能重启?
    [转]xen虚拟windows使用vnc桌面鼠标位置偏移现象的解决
    基于模板的代码生成器
    区分JavaScript中的undefined,null和NaN
    ExtJS+ASP.NET实现异步Tree的节点搜索和查找下一个(FindNext)
    ExtJS+ASP.NET实现Tree节点的拖动(DragDrop)
    ExtJS+ASP.NET实现真实的进度条显示服务器端长时间操作的进度
    说说企业架构(企业级架构)和应用程序架构
  • 原文地址:https://www.cnblogs.com/liwanliangblog/p/15084683.html
Copyright © 2011-2022 走看看