为什么要学习C语言

在学习C语言之前,你必须了解C语言是用来做什么的。 也许你看了书中的示例代码,你会感到困惑。 似乎你可以写一些东西,比如将华氏温度转换为摄氏度,或者对一堆数字进行排序。 简而言之,语言是用来编写程序的。 那么什么是程序呢? 我不知道你对计算机了解多少,但我想你应该知道,计算机的处理器可以一条一条地处理指令,而这些指令对应着对数据的不同操作。 当计算机运行程序时,会将这些指令和数据加载到内存中,然后一一执行。 我相信您也知道所有计算机都使用二进制在内部表示信息。 在机器中,每条指令也是用一个二进制数来表示的。 我们很难记住这些数字和指令之间的对应关系,其表现也不够直观。 于是计算机科学家开始使用助记符(如mov、jmp等)来表示指令。 这称为汇编语言。 尽管与手工编写的机器代码相比有所改进,但最终汇编语言只是一个非常浅的抽象层。 要实现一个复杂的功能,可能需要编写很长的代码。 更可怕的是,很多汇编代码是不可移植的,切换到另一个平台需要大量的代码更改。 因此,不方便开发大型软件。

在C语言出现之前,已经有很多在汇编语言的基础上进一步抽象出来的高级语言,比如COBOL等,而且很多在某些领域仍然拥有自己的一席之地。 C的抽象在它诞生的时代就做得恰到好处。 它不仅具有高级语言的简单性和表现力,而且贴近底层系统。 另外,它与UNIX系统有着密切的关系。 它成为系统编程和软件开发的首选语言。 与之前的汇编相比,C代码在可移植性方面做了很多改进。 当切换到另一个平台时,只要该平台上有C编译器,就不需要修改或只需要修改少量代码。 我们可以看到,编程语言发展的一个明显趋势就是抽象层次越来越高。 那是另一个故事了。 忘了说了,在编程语言的发展道路上,还有另一个岔路,函数式语言,典型代表就是lisp。 它的思维方式与传统的指令型语言完全不同。 知乎上一位大牛说,函数式语言就是数学。 只要数学不过时,函数式编程语言就不会过时。 然而,在C诞生的时代,由于机器条件的限制,函数式编程语言并没有受到如此多的关注。

历史部分到这里就结束了。 如今在软件项目的实际开发中,C语言所占的比例已经不能再像20世纪80年代、90年代那样了。 我之所以还想学C语言,是因为它与底层有天然的亲近性。 C语言的很多特性和“陷阱”,深入挖掘,其实都是计算机体系结构的问题。 《C标准库》的作者在书中开玩笑说,C可能是少数能够自行实现标准库的语言之一。 所以,学习C的时候,如果只关注语法本身,还是厚道一点比较好。

你好,世界!

大多数初学者用 C 编写的第一个程序是“Hello, world!”。 简而言之,就是一个可以在屏幕上输出这句话的程序。 这句话的出处是C语言之父、Brain之父写的名著《C程序设计语言》。 从那时起,它就成为所有编程语言学习者的第一课。 题主说自己是软件工程专业的学生,​​但不知道你是哪个学校的。 但在我们学校,与牛气冲天的土木工程和校舍相比,软件显得太小了。 很多学生甚至没有选好专业而被转学。 也许你和他们一样,之前对所谓的“程序”或“软件”并没有清晰的概念或印象。 也许你认为软件就像网易云音乐,或者手机上的微信,有漂亮的窗口、按钮和标签。 但当你辛辛苦苦按照书本敲出这一段代码,不一定能一下子打对,却发现只有“黑”屏的时候,你会不会稍稍有些失望呢? 这是我想要的程序吗? 为什么它看起来像这样? 如果你问老师,就说你不想要这样的程序。 脾气不好的老师可能会直接训斥你,比较有耐心的老师可能会告诉你,你已经学会了这个,才打好基础。 但我想你还是不明白这个黑窗代表什么。 这也难怪,因为你在使用,如果你之前没有制作过任何bat脚本,你可能从来没有接触过终端。

但我认为你可以给你的家人打电话谈谈。 如果你的父母在 20 世纪 90 年代接触过计算机,他们应该仍然对 DOS 命令行界面有印象。 也许你小时候也偷看过亲戚玩电脑。 事实上,在所谓的“图形用户界面”出现之前,程序的输入和输出基本上都是依靠命令行中的键盘和屏幕。 你在资源管理器中右键单击要删除的a.txt,在DOS黑屏上输入del a.txt然后回车。 然而,前者可能更加用户友好。 所以你明白了,由于早期计算机的显示技术和设计理念的限制,输入和输出都是在命令行中。 当您运行这个 Hello, world! 时会出现黑色窗口。 程序其实可以理解为早期命令行系统的模拟。 如果你还知道有一种语言叫VB,那就是Hello, world! 可以通过创建一个表单,然后在其上绘制Label来实现。 通过对比可以发现,两者其实并没有本质的区别。 我们之所以喜欢使用输出Hello, world! 的程序在命令行下教授编程的第一课就是它简单,而且不需要考虑输出的布局和格式,只需要考虑内容; 然后C语言的标准库并没有为我们提供这样的图形界面。 其实设计一个图形界面程序并没有那么简单,你需要设置布局,为每个组件编写一个事件响应接口……

作为初学者,应该知道,之所以使用命令行,并不是因为C语言不能作为图形界面,而是因为它离我们初学者时需要挖掘的东西太远了。 无论是写一个命令行Hello,world!,还是点击一个按钮弹出Hello,world!,甚至是用电脑的蜂鸣器来蜂鸣,本质都是一样的。 编程的意义其实,写程序和设计的目的是一样的,都是为了解决问题。 (虽然有些人喜欢欣赏所谓的“纯技术”)国内大学教材最大的缺点之一就是只告诉你这是什么,却从来没有告诉你学起来有什么用。 即使提到所谓的目的,也给人的感觉只是用来凑数的。 不相信? 大家可以将我校数学系编着的紫色《线性代数》与国外优秀的线代数教材进行对比,看看两者的差距有多大。 虽然C语言相比Java、Java等语言缺少很多必要的“轮子”,但对于初学者来说,写一些可以跑石头剪刀布的代码,或者能够从文本文件中读取生词,然后检查你的记忆力 无论程序有多好,它都能带来巨大的成就感。 上编程课和上高等数学不一样,不应该有任何进步。 了解了基本语法后,就可以自己实现了。 期间如果遇到问题,可以在线查看。 写完之后,和别人写得好的比较一下,看看自己还有哪些不足。 对于初学者来说,学习编程的关键是练习。 语法有什么用? 看来谭浩强等许多所谓国内“专家”写的教科书都把C语言当作数学,按照不同的语法内容分成章节。 有些学校最后可能会有笔试。

有些学校甚至要求学生上交手写代码。 我不太能理解和同意这种行为。 作为一个编程初学者,你可能早就受够了这种被动接受,并在心里问自己:就算我全部读完了,我能写什么呢? 实在是写不了什么。 因为在这种情况下,读者很难理解这些语法的含义。 例如,当你在书中读到分支语句和循环语句时,你有没有想过它们的用处? 我可以在没有分支的情况下完成吗?我可以在没有循环的情况下完成吗? 想象一下,我们有一个程序,可以让我们在一堆输入中找到最大的数字。 假设输入固定,第三个数最大,那么我可以在收到第三个输入时直接输出,程序结束,对吗? 你可能觉得我这样耍流氓,哪有这样的节目。 事实上,这就是所谓条件语句存在的本质——程序需要接受不同的输入(任何形式)。 如果输入是固定的,那么理论上我可以在没有条件语句的情况下重写代码。 变量的概念也是因为它所包含的值是不确定的。 话说回来,分支结构是不是只用if语句就可以实现呢? 你让我求出一年中每个月的天数,我可以开一个数组保存下来,然后分别判断闰年吗? 你让我输出1到100之间任意整数的平方,理论上我也可以用…case语句或者if,直接输出n*n。 是不是更容易理解、更方便呢? 循环其实也类似,只不过它的目的是重复执行某段代码,而且重复次数不固定。

我们说过,编程的目的是为了解决问题,而不是让你在写代码的时候故意炫耀一些东西来把代码搞乱,就像高中写语文作文一样。 每次学习某个语法概念时,你都要问自己,如果没有这个东西,还有什么程序是写不出来的吗? 也就是说,如果没有这样的语法,我写程序的时候会增加多少麻烦呢? 理论上,编程语言只需要非常简单的语法就可以编写任何形式的程序。 (你可以搜索“图灵完备性”)但是为什么有这么多编程语言呢? 为什么有些编程语言适合特定领域? 为什么人们认为编写小程序比C更方便? 与现代高级脚本语言相比,C语言的语法可谓“简单”。 标准库提供的东西不多,实际编程中用到的一些数据结构必须我们自己实现。 在自己“造轮子”的过程中,你会亲自体验内存分配等事情,并在此基础上了解一些高级数据结构在其他语言中的实现原理。 比如链表,比如内存池。 公式和代码的区别虽然在刚开始学习编程的时候,很多同学都会使用C语言作为计算器。 比如我输入一个变量a,然后计算它的函数,然后输出。 在这个层面上,我们可以说,如果不考虑溢出的话,数学公式(或理论算法)和实际代码可能是等价的。 这是一个非常简单的案例。

但当我们的程序越来越大、步骤越来越复杂的时候,写代码可能就没那么简单了。 比如我们用C写高精度乘法,最简单的情况就是两个数组,每个元素代表一个位。 如果你在脑子里想一想,它可能非常简单:只需一点一点地相乘和相加即可。 但如果真的手写的话,就会面临这样一个问题:既然我的数字没有占据整个数组,那么到底该往左还是往右呢? 乘法的过程不可能一次性完成,是否需要一个临时数组来保存中间结果? 如何知道本轮乘法的数量是几十、几百还是几千? 乘法函数应该有多少个参数? 如果问题包含小数,我如何知道最终结果小数点后有多少位? 我该如何输出呢? ……虽然在搞比赛的人眼里,这根本就是一道不算入门题的题,但还是有很多人一次都写不好(比如我……)。 数学算法和公式是通用的,但要实现为程序,必须基于特定语言的语法。 为什么人们说要学好编程,需要多练习? 因为修行就是一个踩坑的过程。 这次我就踏进了这个坑,知道这样很容易出错,所以我断定,以后也一样。 世界上的大事一定要做详细,这就是所谓的编码能力。 对于编程初学者来说,知道并不意味着知道怎么做。 所以如果有什么程序你老是写错,不要一下子泄气,而是要有一个印象。 例如,数组不会自动初始化。 例如,如果不加花括号,则只执行下一句。

C语言及底层系统我们说过,C语言诞生时,因为有适当的抽象层次,所以能够抓住历史潮流,成为最流行的语言之一。 所谓“适当级别”,是指避免直接面对机器指令,并没有完全隐藏计算机运行原理。 那么你学得再深入一点,你就会有很多疑问…为什么("%u", -1); 会输出结果吗? 为什么数组访问a[-1]但程序没有出错? 为什么 char str[]= "abcd"; 我可以修改str[0],但是对于char *str= "abcd"; 为什么我#G 3+3 而G*G 的结果是15? 为什么scanf的参数名要加&号? 为什么和scanf参数可以不固定? 为什么浮点数加10次0.1后结果是0.99999? 为什么当本地数组太大时程序会爆炸? …大部分问题,如果深挖的话,都与计算机体系结构、计算机内部数据表示、可执行文件格式、编译原理等有关。知其然不知其所以然,很难说你懂了C语言。 数据结构 作为一个看到算法就头晕的非ACMer,我自认为没有任何资格谈论数据结构。 但我想从另一个角度来谈谈这个问题。 数据结构和算法的重要性不用多说,太多人会像长辈一样告诉你,要想写好程序,数据结构是最重要的。

数据结构确实很重要。 但你有没有想过什么是数据结构,数据结构的本质是什么? 有大量的数据结构教学书籍从一开始就向你灌输各种数据结构的概念,然后引导你用实际代码实现这些结构(大多是C++或Java书籍)。 不过,我觉得这些作者还是忽略了一个问题,即:这些东西有什么用? 事实上,每一个数据结构都可以看作是对现实生活中对象的描述。 为什么会有堆栈? 因为有很多场景需要先进后出。 更本质的是,在这些场景中,先进的需要包含落后的才能完成。 例如,C语言函数的调用堆栈,以及反向表达式的求值。 或者在生活中,如果我们想要拆开一台电脑,我们必须先打开它的外壳,然后拆下大部件,最后拆下大部件中包含的小部件。 如果我们想把它装回去,我们必须先安装小,然后安装大。 这里有一个顺序。 可以说,当我们拆解机器时,每个零件都形成一个堆栈,外壳在堆栈的底部,内部的小零件在堆栈的顶部。 当然,修电脑的时候,我可以把所有的零件乱七八糟地扔在床上,需要安装的时候再找到,而不是像数组一样排序。 为什么? 因为当我完成步骤k的时候,我心里就知道步骤k+1需要哪些部分。 在编写程序时,例如求反向表达式的值,我无法知道下一个“部分”是什么,我只能猜测它是堆栈的顶部元素。

因此,在真正的程序中,必须是有序的。 这就是栈这个数据结构的来源,它是一个抽象。 本质上,这也是一个信息问题。 其他数据结构,例如队列、树、哈希表等,也可以被视为现实生活中事物如何工作的描述。 例如,树就是一种非常典型的递归结构。 想想中世纪欧洲的封建制度。 原则是“我只需向我下面的人发号施令”。 所谓二叉树的独特之处在于它是树的最简单形式。 一个节点有两个子节点的情况是生活中最常见的。 例如,我们的四个算术运算可以用一棵树来表示。 好了,说到四种算术运算,我们可以把普通的中序表达式转化为逆表达式,本质上就是把二叉树变成了栈,感受一下这个算法。 更功利一点? 其实,如果只是针对这个话题本身,我觉得没必要说那么多。 大部分软科院校对新生的C语言考核要求还是不高(可能是我们学校太渣了?)。 学期末电脑上有三道题。 第一题无脑,第二题需要考很多C语言的语法内容,第三题会涉及到数据结构。 不过不懂的人可以根据自己的感受写几组。 数据。 所以如果你的目标是通过考试并取得好成绩,可能就没有必要花那么多时间看这些“有事无事”。 后面的回答中提到的一些事情,大概是从从事C开发的专业人士的角度来阐述的。 如果你是大一新生,不知道自己以后要做什么工作,也许你可以做前端。

我绝对不相信一个对操作系统不太了解的大学生真能像有些人说的那样吃APUE,更不相信一个连C编程和Linux操作都不熟悉的人吧? 建议去图书馆看看C语言相关的书籍。 如果您正在学习计算机,请不要害怕这些书籍。 厚并不一定意味着难以阅读。 大学的任课老师一个学期教不了多少内容,大部分都要自己看。 一个好的老师只能给予学生最积极的引导,让他们少走弯路。 在这个时代,大学生可以接触到的项目有很多。 主要的类型无非是Web相关的,并且大部分不使用C语言。 但不要因此而否定C/C++的价值,知乎上的大牛们对此已经谈得很多了。 另外,请记住,C 和 C++ 是两种语言,并且 C++ 与 C 并不完全兼容。不相信吗? 尝试在 C 和 C++ 中分别输出 ('Z')。

语言学中的c_语言学c是什么意思_如何学习c语言

好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注