对于编程语言来说,经常看到有因为各自支持的语言阵营而互怼的,其实根本没那个必要,都只是一种工具而已。当多数主流语言都会使用时也许你就不会有偏见了,本质不过都是用来描述计算机的一个任务,只是每门语言设计时考虑的侧重点不一样而已。大家最好不要停留在语言层面去争执,不如把时间花在计算机实现原理和结构的本质上,这样更能理解编程语言每一行描述的东西在计算机是干什么的。

关于C语言

C语言是最经典的语言,很多其他语言的运行环境也是用C来写的,对于写程序的人则能不懂C语言呢!提到C首先必然会让人关联到指针,当年在大学让你困惑的指针却是C语言威力无穷的基础。C语言可能从更高层面的设计和编写效率上有所欠缺,但却足够经典且容易操控底层。指针虽然风险不小,但却十分强大。此外ANSI C也增强了C程序在不同操作系统的迁移性,下面列一些C语言的一些基础知识。

C/C++的学习裙【七一二 二八四 七零五 】,无论你是小白还是进阶者,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

翻译阶段

编写好的C程序需要先编译成可执行的机器指令才能运行,这便是翻译工作。翻译的主要步骤是编译和链接,编译就是源代码到目标代码,而链接是将各个目标文件链接起来从而形成一个可执行的程序,当然链接器也会引入被程序所用到的所有标准C函数库的函数。有时编译过程还会将预处理作为一个阶段,它主要是对源文件进行一些处理,比如将#define替换成实际值、将#include指定的文件内容填充进来。下面是使用gcc来编译并链接的例子,经过编译和链接后得到可执行程序,这两个步骤通过gcc来完成,命令为gcc hello.c -o hello,最终运行./hello会输出“hello world”。

  1. #include<stdio.h>
  2. int main()
  3. {
  4. printf("hello world");
  5. }

假如我们编写了多个c文件,则编译器会分别编译成多个obj目标文件,然后再通过链接器将所有目标文件链接起来生成可执行文件。

关于扩展名

注意windows系统的目标文件扩展名为obj,一般链接完成后也不会被删除。而unix-like系统的目标文件扩展名为o,一般在链接完成后会被删除。windows系统的可执行文件扩展名为exe,而unix-like系统的可执行文件名可以任意命名。此外,C语言源文件一般后缀为c,而头文件后缀为h,虽然没有强制规定但大家都会去遵守这个约定。

关于编译器

翻译阶段需要将C语言代码变为可执行程序,这些工作由C编译器完成。C编译器也有很多,常见的如下:

  • GCC,GCC即(GNU Compiler Collection,GNU编译器套件),由GNU开发的GPL许可的编译器自由软件。刚开始只作为C语言编译器,但后来发展成多种语言编译器,比如C、C++、Java、Android、Objective-C和Fortran等等。现在很多unix-like操作系统自带GCC,将其作为标准编译器。
  • MS C,与微软的Visual Studio一起集成发布,由微软提供的一套完整的集成开发环境,编译后能在微软的所有操作系统上运行。比如VS一般会使用CL编译器。
  • Clang,它是一个基于LLVM的C/C++/Objective-C轻量级编译器,常用于Mac系统下。
  • Turbo C,这是一个比较流行的C编译器,小巧快速。
  • cc,即C Compiler,这是一个unix系统古老的编译器,很多经典书籍会看到这个编译器。为保持兼容,现在的linux系统会将cc作为一个符号连接指向gcc,即/usr/bin/cc -> gcc。

gcc编译例子

以linux系统的gcc为例,看几个编译例子。假如hello.c的代码如下,

  1. #include<stdio.h>
  2. int main()
  3. {
  4. printf("hello world");
  5. }

我们直接使用如下的gcc命令对其进行编译,而且不带任何参数,此时将生成一个名为out.a的可执行文件,通过./a.out能够输出“hello world”。

  1. gcc hello.c

假如添加name.h/name.c和adder.h/adder.c两对头文件和源文件,而且将hello.c稍作修改,三个文件代码分别如下。

  1. //name.h
  2. char* get_name();
  3. //name.c
  4. char* get_name() {
  5. char* name = "seaboat : ";
  6. return name;
  7. }
  1. //adder.h
  2. int add(int a, int b);
  3. //adder.c
  4. int add(int a, int b) {
  5. return (a + b);
  6. }
  1. //hello.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include"adder.h"
  6. #include"name.h"
  7. int main()
  8. {
  9. char* name = get_name();
  10. char* hello = "hello world";
  11. char* output = (char*)malloc(strlen(hello) + strlen(name));
  12. sprintf(output, "%s%s", name, hello);
  13. printf("%s\n", output);
  14. int a = 1;
  15. int b = 3;
  16. printf("a + b = %d\n", add(a, b));
  17. }

则通过如下的命令可以对多个源文件进行编译和链接,最终生成一个名为a.out的可执行文件。当我们通过./a.out执行可执行文件时,它将输出“seaboat : hello world a + b = 4”。

  1. gcc name.c adder.c hello.c

我们还可以通过下面两个命令对name.c和adder.c两个文件编译生成目标文件,分别为adder.o和name.o。然后再通过下面第三行命令来编译hello.c源文件,编译完后它会自动与name.o和adder.o两个目标文件进行连接。

  1. gcc -c adder.c
  2. gcc -c name.c
  3. gcc name.o adder.o hello.c

此外,还能够通过下面的命令来给多个源文件进行编译并生成各自对应的目标文件,这意味着不对它们进行链接。

  1. gcc -c name.c adder.c hello.c

对于多个目标文件,如果要将他们链接可以通过下面的命令,便能够生成可执行文件。

  1. gcc name.o adder.o hello.o

如果我们想对生成的可执行文件进行命名,那么可以通过下面第一行命令来实现,将生成一个名为hello的可执行文件。类似地,也可以对多个目标文件进行连接时指定可执行文件名,如下面第二行命令,将生成一个名为hello2的可执行文件。

  1. gcc name.c adder.c hello.c -o hello
  2. gcc name.o adder.o hello.o -o hello2

关于字符集

编写C语言时源代码可以包括如下字符集:

  1. 英语大写小写字母
  1. A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  2. a b c d e f g h i j k l m n o p q r s t u v w x y z
  1. 十进制的阿拉伯数字
  1. 0 1 2 3 4 5 6 7 8 9
  1. 其它符号
  1. ! " # % & ' () * + , - . / :
  2. ; < = > ? [ ] \ ^ _ { } | ~
  1. 空白符
  1. 空格、水平制表符、垂直制表符、换行、换页

关于注释

C语言提供的注释方式有两种:以/*开始而以*/结束来注释多行代码,以//开始来注释单行代码。一般来说对源码中进行注释则意味着编译时会被预处理器清除掉,用空格来替代。

  1. /*
  2. 第一种注释方式
  3. */
  4. //第二种注释方式

关于标识符与关键词

标识符就是我们开发人员对变量、函数、类型、结构体、宏等等的起名,C语言也要求我们要按照它的规定来取名。按照规定,标识符可以由英文大小写字母(A~Z, a~z)、阿拉伯数字(0~9)、和下划线(_)组成。需要注意以下几点:

  • 要求不能以字母开头。
  • C语言对大小写字母敏感。
  • C语言不会对标识符的长度进行限制,但标准允许编译器忽略第31位以后的字符,具体截取前多少位则由不同的编译器来实现,当截取的字符串相同时则认为是同一个标识符。
  • 标识符不应该乱取名,尽量要让标识符名字具有相应的意义。

当然C语言还保留了32个特殊的关键词,我们命名的标识符不能与它们相同,否则就会报错。这32个关键词如下:

作者:超人汪小建
来源:掘金

编程小白必备——主流语言C语言知识点的更多相关文章

  1. C语言程序设计基础知识点概括

    C语言程序设计基础知识点概括 C语言程序设计基础知识点1.函数是C语言的基本构成单位.main函数是C语言程序的唯一入口.2.C语言程序开发过程. 编译过程:将以.c或.cpp结尾的源程序文件经过编译 ...

  2. 【C语言】数组知识点总结

    [C语言]数组知识点总结 标签: 数组 2018年04月12日 17:44:4481人阅读 评论(0) 收藏 举报  分类: C语言知识总结(4)  版权声明:本文为博主原创文章,未经博主允许不得转载 ...

  3. 编程精粹--编写高质量C语言代码(3):自己设计并使用断言(二)

    接着上一遍文章<<编程精粹--编写高质量C语言代码(2):自己设计并使用断言(一)>>,继续学习怎样自己设计并使用断言,来更加easy,更加不费力地自己主动寻找出程序中的错误. ...

  4. 添物零基础到大型全栈架构师 不花钱学计算机及编程(预备篇)— C语言编程基础

    ​C语言介绍 C语言基本是每个编程人员必学的一面语言,很好掌握,是理解编程的关键.很多编程语言基于其编写或者基于此语言的衍生品编写. C语言是人机交互的一个基础语言之一,虽然是之一,单一般其实就是唯一 ...

  5. Java程序员的现代RPC指南(Windows版预编译好的Protoc支持C++,Java,Python三种最常用的语言,Thrift则支持几乎主流的各种语言)

    Java程序员的现代RPC指南 1.前言 1.1 RPC框架简介 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦.于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大 ...

  6. 2个月,我从编程小白成为了Python研发工程师

    从编程小白,到Python研发工程师,需要多久呢? 答案就是:91门课,450个小时. 听起来似乎难以实现,但其实如果每天抽出八小时学习,两个月的时间,就能由编程小白转变成为Python工程师,听起来 ...

  7. “编程小白学python”阅读笔记

    今天在豆瓣搜索“python”关键字,搜到一本知乎周刊,读来觉得不错 编程小白学python ,作者@萧井陌, @Badger 书中提到的很多书,第一次看惊呆了,记录下来,希望每周回看此博文,坚持学习 ...

  8. 推荐五个java基础学习网站,小白必备

    不知道去哪找java基础资料?推荐几个学习网站,小白必备 Java经过20多年的发展,仍然是世界上最受欢迎的编程语言之一,有无限多种方法使用Java.拥有庞大的客户群.并且java应用范围很广,基本只 ...

  9. Atitit.go语言golang语言的新的特性  attilax总结

    Atitit.go语言golang语言的新的特性  attilax总结 1. 继承树less  动态接口1 1.1. 按照书中说的,Go语言具有以下的特征,下面我们分别来进行介绍.  q 自动垃圾回收 ...

随机推荐

  1. viewpager欢迎页面底部点的滑动效果

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layo ...

  2. golang1.16内嵌静态资源指南

    今天是万圣节,也是golang1.16新特性冻结的日子.不得不说自从go2路线发布之后golang新特性的迭代速度也飞速提升,1.16中有相当多的重要更新,包括io标准库的重构,语言内置的静态资源嵌入 ...

  3. 4g工业路由器的覆盖范围分析

    4G工业路由器通常覆盖范围在60-80米之间,而影响4G工业路由器的覆盖范围有以下几个因素. 影响4g工业路由器覆盖范围的因素一:环境 空旷的环境下4g工业路由器的信号覆盖范围必然更加广阔,如果传输环 ...

  4. Jmeter 函数助手对话框简单使用

    第一步 打开Jmeter,Tools > 函数助手对话框  下拉框选择_CSVRead ,如下图所示: 第二步: 准备一份测试数据,保存在本地盘符里,数据如下图所示: 第三步,填数据,  (1) ...

  5. (2)ASP.NET Core3.1 Ocelot路由

    1.路由 前一个章节我们已经介绍过Ocelot,相信大家也了解到,Ocelot的主要功能是接收客户端等传入的HTTP请求,并将其转发到下游服务.Ocelot当前仅以另一个http请求的形式支持此功能( ...

  6. [POJ 2821]TN's Kindom III(任意长度循环卷积的Bluestein算法)

    [POJ 2821]TN's Kindom III(任意长度循环卷积的Bluestein算法) 题面 给出两个长度为\(n\)的序列\(B,C\),已知\(A\)和\(B\)的循环卷积为\(C\),求 ...

  7. 前言「HarmonyOS应用开发基础篇」

    场景一.随着智能设备种类的不断增多,我们基本上每人都有好几台智能设备,比如智能手机,平板,耳机,音响,穿戴设备等等.这些设备都具有独立性,偶尔的组合也是我们通过手动去搭配,并且不一定能够完全组合在一起 ...

  8. 都知道的copy_from_user

    Q:一直知道内核和用户态的数据交互前都需要 校验地址的合法性,一般都用copy_from/to_user完成数据拷贝,那么为什么要这样呢?? A:看了一些blog以及Stack Overflow 主要 ...

  9. 分布式 task_master / task_worker

    17:08:0317:08:04 在Thread(线程)和Process(进程)中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分 ...

  10. linux中使用head,tail,grep, sed,awk三种方法显示文档中间若干行(指定任意行)

    需要显示文本中间20-25行. 创建一个30行的文档,命名为30.txt并显示在屏幕 [root@v2-ui data]# seq 30 > 30.txt && cat 30.t ...