【跟着陈七一起学C语言】今天总结:初识C语言

友情链接:专栏地址

知识总结顺序参考C Primer Plus(第六版)和谭浩强老师的C程序设计(第五版)等,内容以书中为标准,同时参考其它各类书籍以及优质文章,以至减少知识点上的错误,同时方便本人的基础复习,也希望能帮助到大家

最好的好人,都是犯过错误的过来人;一个人往往因为有一点小小的缺点,将来会变得更好。如有错漏之处,敬请指正,有更好的方法,也希望不吝提出。最好的生活方式就是和努力的大家,一起奔跑在路上


文章目录

  • 🚀一、C语言的起源
  • 🚀二、选择C语言的理由
    • ⛳(一)C语言的特点
    • ⛳(二)C语言的应用范围
  • 🚀三、编译C语言
    • ⛳(一)计算机工作原理、高级计算机语言和编译器
    • ⛳(二)使用C语言的7个步骤
    • ⛳(三)编程机制
  • 🚀四、语言标准
    • ⛳(一)K&R C 或 经典C
    • ⛳(二)第一个ANSI/ISO C标准
    • ⛳(三)C99标准
    • ⛳(四)C11标准
  • 🚀五、一些常见系统对C的编译
    • ⛳(一)GNU编译器集合和LLVM项目
    • ⛳(二)UNIX系统
    • ⛳(三)Linux系统
    • ⛳(四)Windows系统
    • ⛳(五)Macintosh系统
  • 🚀六、集成开发环境
  • 🚀七、命令行参数


🚀一、C语言的起源

1972年,贝尔实验室的丹尼斯·里奇(Dennis Ritch)和肯·汤普逊(Ken Thompson)在开发UNIX操作系统时设计了C语言。然而,C语言不完全是里奇突发奇想而来,他是在B语言(汤普逊发明)的基础上进行设计。至于 B 语言的起源,那是另一个故事。

🚀二、选择C语言的理由

⛳(一)C语言的特点

1.设计特性

C是一门流行的语言,融合了计算机科学理论和实践的控制特性。C语言的设计理念让用户能轻松地完成自顶向下的规划、结构化编程和模块化设 计。因此,用C语言编写的程序更易懂、更可靠。

2.高效性

C是高效的语言。在设计上,它充分利用了当前计算机的优势,因此 C 程序相对更紧凑,而且运行速度很快。实际上,C 语言具有通常是汇编语言才具有的微调控制能力,可以根据具体情况微调程序以获得最大运行速度或最有效地使用内存。

汇编语言是为特殊的中央处理单元设计的一系列内部指令,使用助记符来表示;不同的 CPU 系列使用不同的汇编语言

3.可移植性

C是可移植的语言。这意味着,在一种系统中编写的 C 程序稍作修改或不修改就能在其他系统运行。如需修改,也只需简单更改主程序头文件中的少许项即可。

由于C语言与UNIX关系密切,UNIX系统通常会将C编译器作为软件包的一部分。安装Linux时,通常也会安装C编译器。供个人计算机使用的C编译器很多,运行各种版本的Windows和Macintosh(即, Mac)的PC都能找到合适的C编译器。因此,无论是使用家庭计算机、专业工作站,还是大型机,都能找到针对特定系统的C编译器。

程序中针对特殊硬件设备(如,显示监视器)或操作系统特殊功能(如,Windows 8或OS X)编写的部分,通常是不可移植的

4.强大而灵活

C语言功能强大且灵活(计算机领域经常使用这两个词)。例如,功能强大且灵活的UNIX操作系统,大部分是用C语言写的;其他语言(如, FORTRAN、Perl、Python、Pascal、LISP、Logo、BASIC)的许多编译器和解释器都是用C语言编写的。因此,在UNIX机上使用FORTRAN时,最终是由C程序生成最后的可执行程序。C程序可以用于解决物理学和工程学的问 题,甚至可用于制作电影的动画特效。

5.面向程序员

C 语言是为了满足程序员的需求而设计的,程序员利用 C 可以访问硬件、操控内存中的位。但 C 语言在提供更多自由的同时,也让使用者承担了更大的责任。

大多数C实现都有一个大型的库,包含众多有用的C函数。这些 函数用于处理程序员经常需要解决的问题。

6.缺点

C语言使用指针,而涉及指针的编程错误往往难以察觉。

C语言紧凑简洁,结合了大量的运算符。正因如此,我们也可以编写出让人极其费解的代码。虽然没必要强迫自己编写晦涩的代码,但是有兴趣写写也无妨。甚至C语言还举办过年度混乱代码大赛

⛳(二)C语言的应用范围

早在20世纪80年代,C语言就已经成为小型计算机(UNIX系统)使用的主流语言。从那以后,C语言的应用范围扩展到微型机(个人计算机)和大型机(庞然大物)。用 C 语言编写的程序紧凑而高效。更重要的是,C程序很方便修改,而且移植到新型号的计算机中也没什 么问题。 无论是软件公司、经验丰富的C程序员,还是其他用户,都能从C语言中受益。越来越多的计算机用户已转而求助C语言解决一些安全问题。不一 定非得是计算机专家也能使用C语言。

  • 特别是,C 语言已成为嵌入式系统编程的流行语言。也就是说,越来越多的汽车、照相机、DVD 播 放机和其他现代化设备的微处理器都用 C 语言进行编程。
  • 作为开发操作系统的卓越语言,C在Linux开发中扮演着极其重要的角色

在这里插入图片描述

20世纪90年代,许多软件公司开始改用C++来开发大型的编程项目。 C++在C语言的基础上嫁接了面向对象编程工具(面向对象编程是一门哲学,它通过对语言建模来适应问题,而不是对问题建模以适应语言)。 C++几乎是C的超集,这意味着任何C程序差不多就是一个C++程序。学习C 语言,也相当于学习了许多C++的知识。

🚀三、编译C语言

⛳(一)计算机工作原理、高级计算机语言和编译器

现代的计算机由多种部件构成。中央处理单元(CPU)承担绝大部分的运算工作。随机存取内存(RAM)是存储程序和文件的工作区;而永久内存存储设备(过去一般指机械硬盘,现在还包括固态硬盘)即使在关闭计算机后,也不会丢失之前储存的程序和文件。另外,还有各种外围设备(如, 键盘、鼠标、触摸屏、监视器)提供人与计算机之间的交互。CPU负责处理程序

CPU 的工作非常简单,至少从以下简短的描述中看是这样。它从内存中获取并执行一条指令,然后再从内存中获取并执行下一条指令,诸如此类 (一个吉赫兹的CPU一秒钟能重复这样的操作大约十亿次,因此,CPU 能以惊人的速度从事枯燥的工作)。CPU 有自己的小工作区——由若干个寄存器组成,每个寄存器都可以储存一个数字。一个寄存器储存下一条指令的内存地址,CPU 使用该地址来获取和更新下一条指令。在获取指令后,CPU在 另一个寄存器中储存该指令,并更新第1个寄存器储存下一条指令的地址。 CPU能理解的指令有限(这些指令的集合叫作指令集)。而且,这些指令相当具体,其中的许多指令都是用于请求计算机把一个数字从一个位置移动到另一个位置。例如,从内存移动到寄存器。

**计算机的工作原理:**如果希望计算机做某些事,就必须为其提供特殊的指令列表(程序),确切地告诉计算机要做的事以及如何做。 你必须用计算机能直接明白的语言(机器语言)创建程序。这是一项繁琐、 乏味、费力的任务

  1. 储存在计算机中的所有内容都是数字。计算机以数字形式储存数字和字符(如,在文本文档中使用的字母)。 每个字符都有一个数字码。计算机载入寄存器的指令也以数字形式储存,指令集中的每条指令都有一个数字码。
  2. 计算机程序最终必须以数字指令码(即,机器语言)来表示。

**高级计算机语言:**高级编程语言(如,C)以多种方式简化了编程工作。首先,不必用数字码表示指令;其次,使用的指令更贴近你如何想这个问题,而不是类似计算机那样繁琐的步骤。使用高级编程语言,可以在更抽象的层面表达你的想法,不用考虑CPU在完成任务时具体需要哪些步骤。

例如,两数相加:

用C语言可以这样写: total = mine + yours;

计算机要完成诸如两数相加这样简单的事,就得分成类似以下几个步骤。

  1. 从内存位置2000上把一个数字拷贝到寄存器1。
  2. 从内存位置2004上把另一个数字拷贝到寄存器2。
  3. 把寄存器2中的内容与寄存器1中的内容相加,把结果储存在寄存器1 中。
  4. 把寄存器1中的内容拷贝到内存位置2008。

而我们要做的是,必须用数字码来表示以上的每个步骤!

编译器:

对于以上提到的两数相加,用C语言实现的代码对我们而言光看一眼就知道计算机要做什么,但如果去看用机器语言写成的等价指令(多条以数字码形式表现的指令)则费劲的多。但是,对计算机而言却恰恰相反。在计算机看来,高级指令就是一堆无法理解的无用数据。编译器在这里派上了用场。

  1. 编译器是把高级语言程序翻译成计算机能理解的机器语言指令集的程序。程序员进行高级思维活动,而编译器则负责处 理冗长乏味的细节工作。
  2. 编译器还有一个优势。一般而言,不同CPU制造商使用的指令系统和编码格式不同。但是,可以找到与特定类型 CPU 匹配的编译器。因此,使用合适的编译器或编译器集,便可把一种高级语言程序转换成供各种不同类型 CPU 使用的机器语言程序。如待会要提到的GNU编译器集合等

⛳(二)使用C语言的7个步骤

C是编译型语言,如BASIC是解释型语言,Visual Basic是面向图形界面语言,如果以前使用的是后两者或从未接触过任何编程语言,就有必要学习如何编译。

在这里插入图片描述

1.定义程序的目标

在动手写程序之前,要在脑中有清晰的思路。想要程序去做什么首先自己要明确自己想做什么,思考你的程序需要哪些信息,要进行哪些计算和控制,以及程序应该要报告什么信息。在这一步骤中,不涉及具体的计算机语言,应该用一般术语来描述问题。

2.设计程序

对程序应该完成什么任务有概念性的认识后,就应该考虑如何用程序来完成它。例如,用户界面应该是怎样的?如何组织程序?目标用户是谁?准备花多长时间来完成这个程序?

除此之外,还要决定在程序(还可能是辅助文件)中如何表示数据,以 及用什么方法处理数据。学习C语言之初,遇到的问题都很简单,没什么可选的。但是,随着要处理的情况越来越复杂,需要决策和考虑的方面也越来越多。通常,选择一个合适的方式表示信息可以更容易地设计程序和处理数据。 同样用一般术语来描述问题,而不是用具体的代码。

3.编写代码

设计好程序后,就可以编写代码来实现它。也就是说,把你设计的程序翻译成 C语言。这里是真正需要使用C语言的地方。可以把思路写在纸上, 但是最终还是要把代码输入计算机。这个过程的机制取决于编程环境。

一般而言,使用文本编辑器创建源代码文件。该文件中内容就是你翻译的C语言代码。以下就是一个C源代码的示例。

#include  <stdio.h>
int main(void) { 
    int dogs; 
    printf("How many dogs do you have?\n"); 
    scanf("%d", &dogs); 
    printf("So you have %d dog(s)!\n", dogs); 
    return 0;
}

4.编译

前面介绍过,编译器是把源代码转换成可执行代码的程序。可执行代码是用计算机的机器语言表示的代码。这种语言由数字码表示的指令组成。如前所述,不同的计算机使用不同的机器语言方案。

C 编译器负责把C代码翻译成特定的机器语言。此外,C编译器还将源代码与C库(库中包含大量的标准函数供用户使用,如printf()和scanf())的代码合并成最终的程序(更精确地说,应该是由一个被称为链接器的程序来链接库函数,但是在大多数系统中,编译器运行链接器)。其结果是,生成一个用户可以运行的可执行文件,其中包含着计算机能理解的代码。

编译器还会检查C语言程序是否有效。如果C编译器发现错误,就不生成可执行文件并报错。理解特定编译器报告的错误或警告信息是程序员要掌握的另一项技能。

5.运行程序

传统上,可执行文件是可运行的程序。在常见环境(包括Windows命令提示符模式、UNIX终端模式和Linux终端模式)中运行程序要输入可执行文件的文件名,而其他环境可能需要运行命令(如,在VAX中的VMS)或一些其他机制。例如,在Windows和Macintosh提供的集成开发环境(IDE) 中,用户可以在IDE中通过选择菜单中的选项或按下特殊键来编辑和执行 C 程序。最终生成的程序可通过单击或双击文件名或图标直接在操作系统中运行。

6.调试和测试程序

程序能运行是个好迹象,但有时也可能会出现运行错误。接下来,应该检查程序是否按照你所设计的思路运行。你会发现你的程序中有一些错误, 计算机行话叫作bug。查找并修复程序错误的过程叫调试(debug)。学习的过程中不可避免会犯错,学习编程也是如此。因此,当你把所学的知识应用于编程时,最好为自己会犯错做好心理准备。随着你越来越老练,你所写的程序中的错误也会越来越不易察觉。

7.维护和修改代码

创建完程序后,你发现程序有错,或者想扩展程序的用途,这时就要修改程序。例如,用户输入以Zz开头的姓名时程序出现错误、你想到了一个更好的解决方案、想添加一个更好的新特性,或者要修改程序使其能在不同的计算机系统中运行,等等。如果在编写程序时清楚地做了注释并采用了合理的设计方案,这些事情都很简单。

编程并非像描述那样是一个线性的过程。有时,要在不同的步骤之间往复。例如,在写代码时发现之前的设计不切实际,或者想到了一个更好的解决方案,或者等程序运行后,想改变原来的设计思路。对程序做文字注释为今后的修改提供了方便。

许多初学者经常忽略第1步和第2步(定义程序目标和设计程序),直接跳到第3步(编写代码)。刚开始学习时,编写的程序非常简单,完全可以在脑中构思好整个过程。即使写错了,也很容易发现。但是,随着编写的程序越来越庞大、越来越复杂,动脑不动手可不行,而且程序中隐藏的错误也越来越难找。最终,那些跳过前两个步骤的人往往浪费了更多的时间,因为他们写出的程序难看、缺乏条理、让人难以理解。要编写的程序越大越复杂,事先定义和设计程序环节的工作量就越大。用纸和笔记录下程序的目标和设计框架。这样在编写代码的过程中会更加得心应手、 条理清晰。

⛳(三)编程机制

用C语言编写程序时,编写的内容被储存在文本文件中,该文件被称为源代码文件(source code file)。大部分C系统,包括之前提到的,都要求文件名以.c结尾(如,wordcount.c和budget.c)。在文件名中,点号(.)前面的部分称为基本名(basename),点号后面的部分称为扩展名 (extension)。因此,budget是基本名,c是扩展名。基本名与扩展名的组合 (budget.c)就是文件名。文件名应该满足特定计算机操作系统的特殊要求。例如,MS-DOS是IBM PC及其兼容机的操作系统,比较老旧,它要求基本名不能超过8个字符。因此,刚才提到的文件名wordcount.c就是无效的DOS文件名。有些UNIX系统限制整个文件名(包括扩展名)不超过14个字符,而有些UNIX系统则允许使用更长的文件名,最多255个字符。Linux、 Windows和Macintosh OS都允许使用长文件名。

源代码文件应该是文本文件,不是字处理器文件(字处理器文件包含许多额外的信息,如字体和格式等)。因此,要使用文本编辑器(如, Windows Notepad)来编辑源代码。如果使用字处理器,要以文本模式另存文件。源代码文件的扩展名应该是.c。一些字处理器会为文本文件自动添加.txt 扩展名。如果出现这种情况,要更改文件名,把txt替换成c。

C编程的基本策略是,用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)。典型的C实现通过编译和链接两个步骤来完成这一过程。C 使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已编译的模块。通过这种方式,如果只更改某个模块,不必因此重新编译其他模块。另外,链接器还将你编写的程序和预编译的库代码合并。

  1. 编译器把源代码转换成中间代码:

    中间文件有多种形式。我们在这里描述的是最普遍的一种形式,即把源代码转换为机器语言代码,并把结果放在目标代码文件(或简称目标文件) 中(这里假设源代码只有一个文件)。虽然目标文件中包含机器语言代码, 但是并不能直接运行该文件。因为目标文件中储存的是编译器翻译的源代码,这还不是一个完整的程序。

    • **目标代码文件缺失启动代码(startup code):**启动代码充当着程序和操作系统之间的接口。例如,可以在MS Windows或Linux系统下运行IBM PC兼容机。这两种情况所使用的硬件相同,所以目标代码相同,但是Windows和 Linux所需的启动代码不同,因为这些系统处理程序的方式不同。
    • **目标代码还缺少库函数:**几乎所有的C程序都要使用C标准库中的函数。目标代码文件并不包含例如print()函数的代码,它只包含了使用 printf()函数的指令。printf()函数真正的代码储存在另一个被称为库的文件中。库文件中有许多函数的目标代码。
  2. 链接器把中间代码和其他代码合并,生成可执行文件:

    链接器的作用是,把你编写的目标代码、系统的标准启动代码和库代码 这 3 部分合并成一个文件,即可执行文件。对于库代码,链接器只会把程序中要用到的库函数代码提取出来

通常,C编译器生成的中间目标代码文件的扩展名是.obj(也可能是其他扩展名)。与UNIX编译器不同,这些编译器在完成编译后通常不会删除这些中间文件。有些编译器生成带.asm扩展名的汇编语言文件,而有些编译器则使用自己特有的格式。

如果要储存可执行文件,应该把它重命名或者另存为。否则,该文件会被下一次编译程序时生成的新文件替换。

如何处理目标代码?C 编译器会创建一个与源代码基本名相同的目标代码文件,但是其扩展名是.o。然而,却找不到这个文件,因为一旦链接器生成了完整的可执行程序,就会将其删除。如果原始程序有多个源代码文件,则保留目标代码文件。

在有些系统中,必须分别运行编译程序和链接程序,而在另一些系统中,编译器会自动启动链接器,用户只需给出编译命令即可。

简而言之,目标文件和可执行文件都由机器语言指令组成的。然而,目标文件中只包含编译器为你编写的代码翻译的机器语言代码,可执行文件中还包含你编写的程序中使用的库函数和启动代码的机器代码。

在这里插入图片描述

🚀四、语言标准

⛳(一)K&R C 或 经典C

C语言发展之初,并没有所谓的C标准。1987年,布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)合著的The C Programming Language(《C语言程序设计》)第1版是公认的C标准,通常称之为K&R C 或经典C。“C语言参考手册”已成为实现C的指导标准,但是该标准定义了C语言,但却没有定义C库。与大多数语言不同的是,C语言比其他语言更依赖库,因此需要一个标准库。实际上,由于缺乏官方标准,UNIX实现提供的库已成为了标准库。

⛳(二)第一个ANSI/ISO C标准

美国国家标准协会 (ANSI)于 1983 年组建了一个委员会(X3J11),开发了一套新标准,并于1989年正式公布。该标准(ANSI C)定义了C语言和C标准库。国际标准化组织于1990年采用了这套C标准(ISO C)。ISO C和ANSI C是完全相同的标准。ANSI/ISO标准的最终版本通常叫作C89(因为ANSI于1989年批准该标 准)或C90(因为ISO于1990年批准该标准)。另外,由于ANSI先公布C标准,因此业界人士通常使用ANSI C。

在该委员会制定的指导原则中,最有趣的可能是:保持 C 的精神。委员会在表述这一精神时列出了以下几点:

  • 信任程序员;
  • 不要妨碍程序员做需要做的事;
  • 保持语言精练简单;
  • 只提供一种方法执行一项操作;
  • 让程序运行更快,即使不能保证其可移植性。

⛳(三)C99标准

1994年,ANSI/ISO联合委员会(C9X委员会)开始修订C标准,最终发布了C99标准。该委员会遵循了最初C90标准的原则,包括保持语言的精练简单。此标准不是在C语言中添加新特性,而是为了达到新的目标:国际化、弥补缺陷和提高计算的实用性

  • 第1个目标是,支持国际化编程。例如,提供多种方法处理国际字符集。
  • 第2 个目标是,“调整现有实践致力于解决明显的缺陷”。
  • 第 3个目标是,为适应科学和工程项目中的关键数值计算,提高C的适应性,

⛳(四)C11标准

标准委员会在2007年承诺C标准的下一个版本是C1X,2011年终于发布了C11标准。此次,委员会提出了一些新的指导原则。出于对当前编程安全的担忧,不那么强调“信任程序员”目标了。而且, 供应商并未像对C90那样很好地接受和支持C99。这使得C99的一些特性成为 C11的可选项。

🚀五、一些常见系统对C的编译

⛳(一)GNU编译器集合和LLVM项目

GNU项目:

GNU项目始于1987年,是一个开发大量免费UNIX软件的集合(GNU的 意思是“GNU’s Not UNIX”,即GNU不是UNIX)。GNU编译器集合(也被称为GCC,其中包含GCC C编译器)是该项目的产品之一。

GCC在一个指导委员会的带领下,持续不断地开发,它的C编译器紧跟C标准的改动。GCC有各种版本以适应不同的硬件平台和操作系统,包括UNIX、Linux和 Windows。用gcc命令便可调用GCC C编译器。许多使用gcc的系统都用cc作为gcc的别名。

LLVM项目:

LLVM项目成为cc的另一个替代品。该项目是与编译器相关的开源软件集合,始于伊利诺伊大学的2000份研究项目。它的 Clang 编译器处理C代码,可以通过clang调用。有多种版本供不同的平台使用,包括Linux。2012 年,Clang成为FreeBSD的默认C编译器。Clang也对最新的C标准支持得很好。

1.GNU和LLVM都可以使用-v选项来显示版本信息,各系统都可以使用 cc 别名来代替gcc或clang命令。如:

cc -v;  //显示你所使用的编译器及其版本。

2.gcc和clang命令都可以根据不同的版本选择运行时选项来调用不同C标准。

//GCC最基本的用法是:gcc [options] [filenames],其中options是所需的参数,filenames是文件名。
gcc -std=c99 inform.c
gcc -std=c1x inform.c
gcc -std=c11 inform.c

第1行调用C99标准,第2行调用GCC接受C11之前的草案标准,第3行调用GCC接受的C11标准版本。Clang编译器在这一点上用法与GCC相同。将gcc换成Clang或cc别名都可

⛳(二)UNIX系统

C语言因UNIX系统而生,也因此而流行,所以我们简单讲讲UNIX系统

1.在UNIX系统上编辑:UNIX C没有自己的编辑器,但是可以使用通用的UNIX编辑器,如emacs、jove、vi或X Window System文本编辑器。

2.在UNIX系统上编译:以前,UNIX C编译器要调用语言定义的cc命令。但是,它没有跟上标准发展的脚步,已经退出了历史舞台。但是,UNIX系统提供的C编译器通常来自一些其他源,然后以cc命令作为编译器的别名。因此,虽然在不同的系统中会调用不同的编译器,但用户仍可以继续使用相同的命令。

⛳(三)Linux系统

Linux是一个开源、流行、类似于UNIX的操作系统,可在不同平台(包括PC和Mac)上运行。在Linux中准备C程序与在UNIX系统中几乎一样,不同的是要使用GNU提供的GCC公共域C编译器。编译命令类似于:

gcc inform.c  //也可用cc

⛳(四)Windows系统

C编译器不是标准Windows软件包的一部分,因此需要从别处获取并安装C编译器。可以从互联网免费下载Cygwin和MinGW,这样便可在PC上通过命令行使用GCC编译器。Cygwin在自己的视窗运行,模仿Linux命令行环境,有一行命令提示。MinGW在Windows的命令提示模式中运行。这和GCC的最新版本一样,支持C99和C11最新的一些功能。Borland的C++编译器5.5 也可以免费下载,支持C90。

许多Linux发行版都可以安装在Windows系统中,以创建双系统。一些存储器会为Linux系统预留空间,以便可以启动Windows或Linux。可以在 Windows系统中运行Linux程序,或在Linux系统中运行Windows程序。不能通过Windows系统访问Linux文件,但是可以通过Linux系统访问Windows文档。

⛳(五)Macintosh系统

目前,苹果免费提供Xcode开发系统下载(过去,它有时免费,有时付费)。它允许用户选择不同的编程语言,包括C语言。

Xcode使用Clang或GCC C编译器来编译C代码,它以前默认使用GCC,但是现在默认使用Clang。可以设置选择使用哪一个编译器和哪一套C标准(因为许可方面的事宜,Xcode中 Clang的版本比GCC的版本要新)。

UNIX系统内置Mac OS X,终端工具打开的窗口是让用户在UNIX命令行 环境中运行程序。苹果在标准软件包中不提供命令行编译器,但是,如果下 载了 Xcode,还可以下载可选的命令行工具,这样就可以使用clang和gcc命 令在命令行模式中编译。

🚀六、集成开发环境

许多供应商(包括微软、Embarcadero、Digital Mars)都提供Windows下的集成开发环境,或称为IDE(目前,大多数IDE都是C和C++结合的编译器)。可以免费下载的IDE有Microsoft Visual Studio Express和Pelles C。利用集成开发环境可以快速开发C程序。关键是,这些IDE都内置了用于编写C程序的编辑器。这类集成开发环境都提供了各种菜单(如,命名、保存源代码文件、编译程序、运行程序等),用户不用离开IDE就能顺利编写、编译和运行程序。如果编译器发现错误,会返回编辑器中,标出有错误的行号,并简单描述情况。

虽然Visual Studio支持C89/90,但是到目前为止,它只选择性地支持那些在C++新特性中能找到的C标准(如,long long类型)。而且,自2012版本起,Visual Studio不再把C作为项目类型的选项。不过几乎所有的C程序都能与C++程序兼容

🚀七、命令行参数

在图形界面普及之前都使用命令行界面。DOS和UNIX就是例子。Linux 终端提供类UNIX命令行环境。

命令行(command line):是在命令行环境中, 用户为运行程序输入命令的行。

命令行参数(command-line argument):是同一行的附加项,在启动这个程序的时候可以给这个程序从命令行中传递一些参数。linux下经常会使用命令行参数,例如:这个- l就叫做命令行参数:

在这里插入图片描述

命令行参数实现原理:

C编译器允许main()没有参数或者有两个参数(一些实现允许main()有更多参数,属于对标准的扩展):

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main(int argc,char* argv[])
{
    int i = 0;
    printf("%d\n", argc);//输出argc
    for (i = 0; i < argc; i++)
    {
        printf("%s\n", *(argv + i));//输出命令行参数
    }
    return 0;
}
  • argc :命令行参数的个数
  • argv :命令行参数的内容
  • 有时还会有第三个参数char* envp[],envp[]:存储环境变量的地址,具体是啥环境变量我也看不懂。

在Windows系统下的命令行环境中:win+R —》输入cmd(按下回车) —》直接拖动你要执行的可执行文件(后缀名必定是.exe的,或者cd到可执行文件所在目录,然后输入可执行文件名直接回车即可)

在这里插入图片描述

跟在执行文件后面的参数的地址都存在argv[]中,我们只需要读取其中的内容,在函数内部判断,就可以依次执行命令,该程序把命令行字符串储存在内存中,并把每个字符串的地址储存在指针数组中。而该数组的地址则被储存在 main()的第 2 个参数中。

许多程序员用不同的形式声明argv:

int main(int argc, char **argv)

在这里插入图片描述

集成环境和Mac中的命令行参数:

1.Windows集成环境(如Xcode、Microsoft Visual C++和Embarcadero C++ Builder)都不用命令行运行程序。有些环境中有项目对话框,为特定项目指 定命令行参数。其他环境中,可以在IDE中编译程序,然后打开MS-DOS窗 口在命令行模式中运行程序。但是,如果你的系统有一个运行命令行的编译 器(如GCC)会更简单。

2.如果使用Xcode 4.6(或类似的版本),可以在Product菜单中选择 Scheme选项来提供命令行参数,编辑Scheme,运行。然后选择Argument标 签,在Launch的Arguments Pass中输入参数。或者进入Mac的Terminal模式和UNIX的命令行环境。然后,可以找到程 序可执行代码的目录(UNIX的文件夹),或者下载命令行工具,使用gcc或 clang编译程序。


行文至此,落笔为终。文末搁笔,思绪驳杂。只道谢不道别。早晚复相逢,且祝诸君平安喜乐,万事顺意。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/19283.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Speech and Language Processing之word2vec

1、介绍 事实证明&#xff0c;在每一个NLP任务中&#xff0c;密集向量都比稀疏向量工作得更好。虽然我们不能完全理解其中的所有原因&#xff0c;但我们有一些直觉。首先&#xff0c;密集向量可以更成功地作为特征包含在机器学习系统中;例如&#xff0c;如果我们使用100维…

如何高清视频录制?您只需要这样操作!

案例&#xff1a;如何录制画质高清的视频&#xff1f; 【我录制了一个视频课程&#xff0c;上传到网上&#xff0c;但是我录制的视频画质不好&#xff0c;影响观感。有没有支持高清录制的录屏工具&#xff1f;有没有小伙伴可以推荐一下&#xff01;在线等&#xff01;】 无论…

BM61-矩阵最长递增路径

题目 给定一个 n 行 m 列矩阵 matrix &#xff0c;矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径&#xff0c;使这条路径上的元素是递增的。并输出这条最长路径的长度。 这个路径必须满足以下条件&#xff1a; 对于每个单元格&#xff0c;你可以往上&#xff…

数组的应用

数组的应用 一、数组的定义二、切片替换删除数值元素 二、数组追加元素三、数组与函数相结合 一、数组的定义 相当于一串数据的集合&#xff0c;以空格相间隔的字符串列表&#xff0c;两边用括号括起来 echo ${shuzu[]}中的代表着显示所有的下标内容&#xff0c;当然&#…

【C++】关联式容器——mapset的使用

文章目录 1.关联式容器和键值对1. 关联式容器2. 键值对 2. 树形结构的关联式容器——set1. 模版参数列表2. 默认成员函数3. 迭代器4.容量相关操作5.modify6.其他操作接口 3. 树形结构的关联式容器——map1. 默认成员函数2. 迭代器3. 容量与数据访问4.数据修改5. 其他操作接口 1…

初识C语言

1. 初识C语言 C语言是一门通用计算机编程语言&#xff0c;广泛应用于底层开发。 C语言是一门面向过程的计算机编程语言&#xff0c;它与C,Java等面向对象的编程语言有所不同。 第一个C语言程序&#xff1a; #include<stdio.h>int main(void) {printf("hello worl…

MyBatis基础知识点总结

MyBatis了解 MyBatis 是什么&#xff1f; MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 MyBatis 可以使用简单的XML或注解用于配置和原始映射&#xff0c;将接口和Java的 POJO&#x…

JVM-内存结构

✅作者简介&#xff1a;热爱Java后端开发的一名学习者&#xff0c;大家可以跟我一起讨论各种问题喔。 &#x1f34e;个人主页&#xff1a;Hhzzy99 &#x1f34a;个人信条&#xff1a;坚持就是胜利&#xff01; &#x1f49e;当前专栏&#xff1a;JVM &#x1f96d;本文内容&…

Mybatis一级缓存详解

目录 一级缓存 一级缓存的组织 一级缓存的生命周期 一级缓存的工作流程 Cache接口的设计以及CacheKey的定义 一级缓存的性能分析 一级缓存与Spring 事务一级缓存存在的弊端 官方文档分析 Spring通过Mybatis调用数据库的过程 一级缓存 对于会话&#xff08;Session&am…

chanmama响应数据解析

0x00目标url aHR0cHM6Ly93d3cuY2hhbm1hbWEuY29tL2F1dGhvckRldGFpbC85OTI0MjExODcxOC9wcm9tb3Rpb24 0x01接口分析 简单的get 但是返回数据被加密了 这里我们就来想想怎么解密这些数据。首先后端发来的数据是加密的&#xff0c;但是我们在前端看到的可不是加密后的数据。前端…

什么是零拷贝?

零拷贝 什么是零拷贝 零拷贝指的是&#xff0c;从一个存储区域到另一个存储区域的copy任务无需CPU参与就可完成。零拷贝的底层是 通过DMA总线技术实现的。零拷贝与具体的编程语言无关&#xff0c;完全依赖于OS&#xff0c;OS支持就可使用&#xff0c;不支持 设置了也不起作用…

大厂视频面试,因为截屏作废

大厂视频面试现在这么严格了么&#xff1f;无意间按到截屏直接显示面试作废&#xff0c;好在最后和HR解释了下&#xff0c;再约时间重新面。 作为一个面试过3、4家大厂&#xff0c;现在在鹅厂工作的过来人来说&#xff0c;上面遇到的这个问题是AI面&#xff0c;不用太担心&…

笔记本电脑开机黑屏没反应怎么办?

笔记本电脑开机黑屏没反应怎么办&#xff1f;有用户电脑开机之后&#xff0c;桌面会变成黑屏显示。而且是常常都会出现这样的问题&#xff0c;非常影响自己的电脑使用体验。那么遇到这个问题要怎么去进行问题的解决呢&#xff1f;来看看以下的解决方法吧。 准备工作&#xff1a…

玩游戏时突然弹出”显示器驱动程序已停止响应并且已恢复”怎么办

随着3A游戏大作不断面市&#xff0c;用户也不断地提升着自己的硬件设备。但是硬件更上了&#xff0c;却还会出现一些突如其来的情况&#xff0c;比如正准备开启某款游戏时&#xff0c;电脑右下角突然出现“显示器驱动程序已停止响应并且已恢复”。遇事不慌&#xff0c;驱动人生…

java lambda表达式详解

一、Lambda初识 我们知道&#xff0c;在Java中&#xff0c;接口是不能实例化的&#xff0c;但是接口对象可以指向它的实现类对象。如果接口连实现对象都没有呢&#xff1f;那还可以使用匿名类的方式&#xff0c;如下: public class JavaTest { public static void main(Strin…

某程序员哀叹:二本计算机,4年开发,年包才40多万。二本真的不如985/211吗?

前段时间&#xff0c;某职场论坛上有人发了一个帖子&#xff0c;发帖人问&#xff1a;为什么大家工资那么高&#xff0c;三五年都六七十万了&#xff1f;我二本计算机专业&#xff0c;四年前端开发&#xff0c;找个年包40万多点就顶头了。 原贴如下&#xff1a; 有网友表示楼主…

2022年平均工资出炉,IT行业又是第一

根据5月9日国家统计局最新资料显示&#xff0c;2022年&#xff0c;全国城镇非私营单位就业人员年平均工资为114029元&#xff0c;比上年增长6.7%&#xff0c;扣除通胀后实际增长4.6%。其中&#xff0c;行业间的差距相当明显。根据资料显示&#xff0c;2022年无论是在私营单位还…

Android---bitmap优化

目录 Bitmap 占用内存大小计算 Bitmap | Drawable | InputStream | Byte[] 之间进行转换 Bitmap 相关方法 BitmapFactory 工厂类 Bitmap 占用内存大小计算 Bitmap 作为位图&#xff0c;需要读入一张图片中每一个像素点的数据&#xff0c;其主要占用内存的地方也正是这些像…

python进阶--月考二

python进阶--月考二 &#xff08;一&#xff09;装饰器&#xff08;二&#xff09;创建名为express.py文件&#xff0c;编写以下推导式&#xff08;25分&#xff09;&#xff08;三&#xff09;创建名为process_test.py的文件&#xff0c;计算1-3000之间的水仙花数&#xff08;…

QT MD4 MD5 Sha1等几种加密方式

QT MD4 MD5 Sha1等几种加密方式 [1] QT MD4 MD5 Sha1等几种加密方式[2] qt MD5 和AES 加密一 、MD5 加密二、AES 加密和解密 [3] QT中sqlite数据库数据加密/混淆---MD5/SHA1/SHA2/SHA3&#xff08;1&#xff09;创建一个加密对象&#xff08;2&#xff09;放入要加密的数据&…