JM233333's Blog
  • Programming Languages

    • C
    • Python
  • Algorithms and Data Structures

    • Data Structure
    • Fundamental Algorithms
    • Graph Theory
  • GNU Toolchain

    • Bash
    • gdb
  • Development Environment

    • Ubuntu
    • QEMU
  • Development Tools

    • Git
    • VSCode
  • Operating Systems

    • Principles of Operating Systems
    • Xv6
    • Linux Kernel
  • Software Testing and Analysis

    • Software Testing
    • Software Analysis
    • Program Verification
  • LeetCode
  • XJTUOJ
  • System

    • System Performance
  • Programming

    • ...
  • Others

    • ...
  • Paper Reading

    • Model Checking
    • Fuzzing
    • Symbolic Execution
  • 3D Game Programming

    • 3D Mathematics

JM233333

弱小可怜又无助的学术废物
  • Programming Languages

    • C
    • Python
  • Algorithms and Data Structures

    • Data Structure
    • Fundamental Algorithms
    • Graph Theory
  • GNU Toolchain

    • Bash
    • gdb
  • Development Environment

    • Ubuntu
    • QEMU
  • Development Tools

    • Git
    • VSCode
  • Operating Systems

    • Principles of Operating Systems
    • Xv6
    • Linux Kernel
  • Software Testing and Analysis

    • Software Testing
    • Software Analysis
    • Program Verification
  • LeetCode
  • XJTUOJ
  • System

    • System Performance
  • Programming

    • ...
  • Others

    • ...
  • Paper Reading

    • Model Checking
    • Fuzzing
    • Symbolic Execution
  • 3D Game Programming

    • 3D Mathematics
  • c

    • C 00 - Introduction
      • 前言
      • 阅读指引图
    • C 01 - Summary of Basic Syntax (unfinished)
    • C 01 - Summary of Basic Debugging Skills
    • C 01 - Develop Good Coding Style and Programming Habits
    • C 01 - Convention of Naming Identifier
    • C 01 - The Right Way to Ask Others for Help
    • C 01 - Summary of Common Mistakes for Beginners
    • C 02 - Pointer
    • C 03 - Function
    • C 03 - Types
    • C 03 - Scope and Lifetime
    • C 03 - Input and Output
    • C 03 - Undefined Behavior and Unspecified Behavior
    • C 04 - Dynamic Memory Allocation
    • C 04 - Type Conversion
    • C 04 - Declaration and Definition
    • C 04 - Lvalue and Rvalue
    • C 04 - Organizing Multiple Source Files (unfinished)
    • C 04 - Summary of Piecemeal Knowledge (unfinished)
    • C 05 - Memory Layout and Rules
    • C 05 - Improve Your Code with [typedef] (unfinished)
    • C 05 - Array Name is NOT a Pointer
    • C 05 - More about Input and Output (unfinished)
    • C 06 - More about the Structure Type
    • C 06 - Macro (unfinished)
    • C 06 - Do not Abuse Side Effects in Subexpressions
    • C 02 - Overview of C Standards
    • C 10 - Introduction to GCC Extensions
    • C 11 - GCC Inline Assembly (unfinished)
  • cpp

  • java

  • python

  • programming-languages
  • c
JM233333
2020-01-01
1350

C 00 - Introduction

Creative Commons

# 前言

由于国内绝大多数高校的计算机系都以 C 语言作为入门语言,且 C 语言本身的使用率也很高,因此 C 语言的零基础入门的教材、网课、在线教程实在是太多了,初学者可以很轻松地找到相关的高质量的内容,更别说大一年级都有 C 语言课。

基于这个事实,我并不打算再写 C 语言的从零开始入门的教程文章,这实在是没有什么意义。因此,本知识板块内的文章主要关注以下内容:

  • 基础知识中的一些难点和易错点,如指针、函数传参原理;

  • 某类知识,如果我发现国内教材和网上的中文资料中存在错误的;

  • 某类知识,如果我发现国内教材和网上的中文资料中鲜有介绍的,或是介绍得不够详细的;

  • 对于初学者而言最重要的,但国内本科课程却没有花费足够精力去教授的,如良好的代码风格、最基本的代码调试技巧;

  • 对于初学者学习语言非常有益的,如初学者常见错误的汇总;

因此,我的 C 语言的文章均 假设读者同时在通过其他途径学习 C 语言 ,并假设读者对编程有一个最基本的认知,而不是面向完全零基础的读者。读者将会看到,对于基础语法,我只对一些有难度的核心内容(例如指针等)写了文章。

即便如此,我相信博客中的内容对初学者而言还是会很有帮助的。毕竟我只是假设读者不是完全零基础,但文章仍然是面向初学者的,其中的许多内容都是在网上较难找到的。

防杠精:我不是说你就找不到,不是说我的博客中讲的东西有多么特别,毕竟我不是神仙,这些知识我也是从各个地方找资料学习的,例如国外著名教材《C 和指针》和《C 专家编程》,再例如 CMU 的教学网站上的 C 语言的 wiki ,有不少内容我还特地去查证了 C 语言 ISO 标准的原始文件。 但是对于初学者来说,查阅这些资料显然过于困难了,具备查阅这些资料的能力的人通常已经脱离了新手期,绝大多数初学者还是会使用国内教材、网课以及网上的中文技术博客,而我则将这其中的错误和缺失的内容找到,总结并用尽可能通俗的语言写成新手友好型的文章,帮助大家学习。

关于 C 语言标准的问题,除非另外声明,我写的 C 语言的文章都默认遵循如下规则:

  • 在介绍理论知识时,遵循 C99 标准,除非涉及 C89 和 C99 之间的差异;

  • 在使用代码示例时,尽量遵循 C99 标准,同时确保代码能在非严格的 C89 标准下正确运行。

这是考虑到国内本科课程经常会使用非严格的 C89 标准,但是 C89 和 C99 中的绝大部分理论知识是一样的,因此我个人认为这样是最合适的,不会产生混淆和误导。

另外,我的文章中所用的编译信息示例(如编译错误示例)均是我本机编译环境的运行结果,在不同编译环境下可能会得到描述有所不同的编译信息,但是其含义应当是相同的,除非你使用的不是标准 C 语言。

特别强调:大多数编译器并不是严格的 C 标准,通常具有一定的扩展,常见的有例如 GNU C 等。但这对初学者接触到的内容而言几乎没有影响,除了 VC6.0 上的编译器以外——因此强烈建议读者在学习 C/C++ 语言时不要使用 VC6.0 进行编程。

个人建议使用诸如 CodeBlocks 这一类的轻量级 IDE 进行初期的学习,但是无论你使用何种 IDE ,绝对不要使用 VC6.0 。


# 阅读指引图

其中:

  • 淡黄色方块表示面向初学者的文章。

  • 小麦色方块表示面向进阶读者的文章。

  • 箭头表示一组前置知识的关系。在阅读一篇文章前,推荐您先阅读其所有前置文章。

  • 虚线箭头表示一组建议的前置关系,是可选的,您可以选择忽略此类提示。

  • 空心大箭头表示你将进入到进阶区域。

  • 淡粉色方块表示来自其他知识板块的文章,因为它们是本板块内某些文章的前置知识,所以被专门标示出来。


#基础教程#编程语言#C

C 01 - Summary of Basic Syntax (unfinished)→

最近更新
01
Linux Kernel 00 - Introduction
08-01
02
Linux Kernel 01 - Build and Run a Tiny Linux Kernel on QEMU
08-01
03
Linux Kernel 01 - Debug the Linux Kernel
08-01
更多文章>
Theme by Vdoing | Copyright © 2019-2022 JM233333 | CC BY-NC-SA 4.0
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式