不敢说自己懂C语言,权当抛砖引玉吧。。

不敢说你懂C语言。

为什么要学习C语言?

在学习 C 之前,您必须了解 C 的用途。可能你看了书中的示例代码,一头雾水,印象中你可以写华氏到摄氏之类的东西,或者对一堆数字进行排序。简而言之,语言是用来编写程序的。

那么什么是程序呢?我不知道你对计算机了解多少,但我想你应该知道,计算机的处理器可以一一处理指令,对应于对数据的不同操作。计算机在运行程序时,会将这些指令和数据加载到内存中,并一一执行。

我相信你也知道计算机内部都是用二进制表示的。在机器中,每条指令也用二进制数表示。我们很难记住这些数字和指令之间的对应关系,其表现也不直观。因此计算机科学家开始使用助记符(如 mov、jmp 等)来表示指令。这称为汇编语言。虽然与手工编写机器码相比是一种改进,但归根结底,汇编语言只是一个很浅的抽象层次。实现一个复杂的功能可能需要编写很长的一段代码。更可怕的是,很多汇编代码是不可移植的,切换到另一个平台需要大量的代码改动。因此,开发大型软件是不方便的。

在C语言出现之前,已经有很多高级语言是在汇编语言的基础上进一步抽象出来的,比如FORTRAN、COBOL等,而且很多在某些领域还是有自己的一席之地的。C的抽象在它诞生的那个时代就做的恰到好处。它具有高级语言的简洁性和表达力,同时也具有接近底层系统的直接性。再加上它与 UNIX 系统的密切关系,C 在随后的几年里已经使用了很多年。它已成为系统编程和软件开发的首选语言。与之前的汇编相比,C 代码在可移植性方面有了很大的进步。如果切换到另一个平台程序,只要那个平台上有C编译器,您不需要修改或只需要修改少量代码。我们可以看到,编程语言发展的一个明显趋势是抽象层次越来越高。比如Java和很多依赖虚拟机的脚本语言,号称“一次编写,到处运行”,都是后来出现的。那是另一个故事。

忘了说,在编程语言的开发中,还有一个分叉,函数式语言,典型的代表是lisp。它的思维方式与传统的指令型语言完全不同。知乎上的一位大牛说,函数式语言就是数学。只要数学没有过时,函数式编程语言就不会过时。然而,在 C 诞生的那个时代,由于机器条件的限制,函数式编程语言并没有受到如此多的关注。

好啦好啦,不说历史部分了。在当今软件项目的实际开发中,C语言所占的比例已经不能与1980年代和1990年代相比了。我之所以要学C语言,是因为它与底层有着天然的亲和性。C语言的很多特性和“坑”,如果深入挖掘,其实是计算机体系结构的问题。《The C Standard Library》的作者在书中打趣说,C 大概是少数可以自行实现标准库的语言之一。所以,在学习C的时候,如果只关注语法本身,就没有python那么友好了。(但我想说,国内一些大学教C语言的老师可能连python是什么都不知道)

什么是你好,世界!

大多数初学者用 C 编写的第一个程序是所谓的“Hello, world!”。简而言之,就是一个可以在屏幕上输出这句话的程序。这句话的出处是C语言之父Dennis Ritchie和Brian Kernighan(不是谭浩强)的名著《C Programming Language》。此后,它已成为所有编程语言学习者的第一课。

题主说他是软件工程专业的学生,​​不知道你是哪个学校的。但是,在我们学校,相比于嚣张的土木建筑学院,软件实在是太小了。很多学生甚至因为选择专业失败而被转学。也许你和他们一样,之前对所谓的“程序”或“软件”没有一个清晰的概念或印象。或许你觉得这款软件就像网易云音乐,或者手机上的微信,有漂亮的窗口、按钮和标签。但是你会不会有点失望,你按照书本费了这么大劲才打完这段代码,可能一次打不准,结果发现只有一个“黑屏” ? 这是我想要的程序吗,为什么这么长?

如果你问你的老师,说你不想要这种程序。脾气不好的老师可能会直接骂你,耐心的老师可能会告诉你,你在打基础之前已经学会了。但我想你还是不明白这个黑窗代表什么。难怪,因为你用的是windows,如果你之前没有做过bat脚本,你可能从来没有接触过终端。但我认为你可以给你的家人打个电话谈谈。如果你的父母在 90 年代了解计算机,他们应该仍然熟悉 DOS 的命令行界面。也许你小时候看过你的亲戚玩电脑。事实上,在所谓的“图形用户界面”出现之前,程序的输入和输出基本上依赖于键盘和命令行中的屏幕。在Windows资源管理器中右键a.txt删除,在DOS黑屏下输入del a.txt然后回车也是一样的效果。但是,前者可能对用户更友好。

所以你明白了,由于早期计算机的显示技术和设计理念的限制,输入输出都是命令行的形式。以及运行 Hello, world! 时出现的黑色窗口!程序其实可以理解为Windows早期命令行系统的模拟。如果你也知道有一种语言叫VB,它的Hello, world!可以通过创建一个表单然后在其上绘制一个标签来实现。通过对比可以发现,两者并无本质区别。我们之所以喜欢使用输出 Hello, world! 的程序的原因 命令行下教编程的第一课就是简单,不考虑输出的布局和格式,只考虑内容;那么C语言的标准库也没有为我们提供这样的图形界面。事实上,设计一个带有图形界面的程序并不是那么简单。需要设置布局,为每个组件写一个事件响应界面……作为初学者应该知道,之所以使用命令行,不是因为C语言不能做图形界面,而是因为太与我们刚开始学习时需要挖掘的东西相去甚远。不管是写命令行Hello, world!,还是点击按钮弹出Hello, world!,甚至是用电脑的蜂鸣器蜂鸣,本质都是一样的。你应该知道,之所以使用命令行,并不是因为C语言不能做图形界面,而是因为它离我们初学时需要挖掘的东西太远了。不管是写命令行Hello, world!,还是点击按钮弹出Hello, world!,甚至是用电脑的蜂鸣器蜂鸣,本质都是一样的。你应该知道,之所以使用命令行,并不是因为C语言不能做图形界面,而是因为它离我们初学时需要挖掘的东西太远了。不管是写命令行Hello, world!,还是点击按钮弹出Hello, world!,甚至是用电脑的蜂鸣器蜂鸣,本质都是一样的。

编程的意义

其实编程和设计的目的是一样的,都是为了解决问题。(虽然有些人喜欢欣赏所谓的“纯技术”)国内大学教材最大的缺点之一就是只告诉你这是什么,而从不告诉你它有什么用。即使提到所谓的用途,也给人一种只是用来凑数的印象。不相信?大家可以对比一下我校数学系编写的子皮《线性代数》和国外优秀的线性代数教材,看看差距有多大。

虽然C语言相比python、Java等语言缺少很多必要的“轮子”,但是对于初学者来说,写一些可以跑石头剪刀布的代码,或者可以从文本文件中读取生词来测试你无论如何程序背下来,能带来很大的成就感。上编程课和上高等数学不一样,应该没什么进步。了解基本语法后,就可以手动实现了,期间如果遇到什么问题,就去网上查一下。写完之后,跟别人写的好,对比一下,看看自己的不足。

初学者编程,关键是练习。

语法是什么?

看来谭浩强等许多国内所谓的“专家”所写的教科书,都把C语言当成数学,按照语法内容的不同分章。有些学校甚至可能在最后进行笔试。一些学校甚至要求学生上交手写代码。我不太理解和同意这种行为。作为一个编程的初学者,你大概已经受够了这种被动接受,心里扪心自问:就算我都读完了,还能写什么呢?

真的什么都写不出来。因为在这种情况下,读者很难理解这些语法的含义。例如,当你在书中读到分支和循环语句时,你有没有想过它们的用途?我可以在没有分支的情况下做到这一点,我可以在没有循环的情况下做到吗?

想象一下,我们有一个程序可以让我们找到一堆输入数字中最大的一个。假设输入是固定的,第三个数最大,那我可以直接输出第三个输入,结束程序吧?你可能会认为我在玩流氓,哪里有这样的节目。其实这就是所谓条件语句存在的本质——程序需要接受不同的输入(任何形式)。如果输入是固定的,那么理论上我可以重写代码以使其没有条件语句。变量的概念,也是因为它所包含的值是不确定的。话虽如此,是否只能使用 if 语句进行分支?你让我求一年中每个月的天数,我能不能打开一个数组来保存,然后分别判断闰年?你让我输出 1 到 100 的任意整数的平方。理论上,我可以用 switch…case 语句或 if 来完成,我可以直接输出 n*n。不是更好理解更方便吗?循环其实也差不多,只是它的目的是重复执行某段代码,重复次数不固定。我们说编程的目的是为了解决问题,而不是让你在写代码的时候,像写高中语文作文那样,刻意炫耀一些东西把代码搞乱。但其目的是重复执行某段代码,重复次数不固定。我们说编程的目的是为了解决问题,而不是让你在写代码的时候,像写高中语文作文那样,刻意炫耀一些东西把代码搞乱。但其目的是重复执行某段代码,重复次数不固定。我们说编程的目的是为了解决问题,而不是让你在写代码的时候,像写高中语文作文那样,刻意炫耀一些东西把代码搞乱。

每次学习一个语法概念,你都要问自己,如果没有这个东西,还有什么程序是写不出来的吗?或者,如果没有这种语法,我在编写程序时会有多麻烦?理论上,编程语言可以编写任何形式的程序,只需要非常简单的语法。(你可以搜索“图灵完备性”)但是为什么有这么多编程语言呢?为什么有些编程语言适合特定领域?为什么人们发现用 python 编写小程序比用 C 更容易?与现代高级脚本语言相比,C语言的语法可以用“简单”来形容。标准库提供的东西不多,实际编程中用到的一些数据结构必须自己实现。在“造轮子”的过程中 自己去感受一下内存分配之类的东西,并在此基础上了解一些高级数据结构在其他语言中的实现原理。例如,链表,如内存池。

公式和代码的区别

虽然说一开始学编程的时候,很多同学都会用C语言当计算器。例如,我输入一个变量a,然后计算它的一个函数并输出它。在这个层面上,如果不考虑溢出情况,我们可以说数学公式(或理论算法)和实际代码可能是等价的。这是一个非常简单的案例。但是当我们的程序越来越大,步骤越来越复杂的时候,写代码可能就没有那么简单了。假设我们使用 C 编写高精度乘法,在最简单的情况下是两个数组,每个元素代表一个位。如果您在脑海中考虑它,它可能非常简单:只需一点一点地相乘并相加即可。但是如果真的写出来,就会面临以下问题:

虽然这是一个在搞比赛的人眼里连切入点都算不上的题,但还是有很多人一次写不准(poj1001,比如我……)。数学算法和公式是通用的,但是要将它们实现到程序中,它们必须确定特定语言的语法。为什么有人说学好编程需要练习?因为练习就是一个踩坑的过程。这次我踩到了这个坑。我知道很容易犯错误。我得出的结论是,未来也会如此。世间大事,必做细,所谓编码能力就是这样。对于编程初学者来说,知道不等于知道如何去做。所以如果有一个你总是写错的程序,不要’ 不要突然气馁,但要留下印象。例如,数组不会自动初始化。例如,如果不添加花括号,则只会执行以下语句。

C语言及底层系统

我们说C语言诞生的时候,因为适当的抽象层次,它成为了最流行的语言之一。这个所谓的“适当级别”是指避免直接面对机器指令,也没有完全隐藏计算机操作的原理。所以如果你再深入一点,你就会有很多问题……

数据结构

作为一个看到算法就头晕的非ACMer,我觉得我没有资格说数据结构。但我想从另一个角度谈谈这个问题。数据结构和算法的重要性不用多说,太多人会像长辈一样告诉你,要想写出好的程序,数据结构是最重要的。数据结构确实很重要。但是你有没有想过什么是数据结构,数据结构的本质是什么?

有大量关于数据结构的书籍一开始就教你各种数据结构的概念,然后引导你通过实际代码来实现这些结构(主要是 C++ 或 Java 书籍)。但我认为这些作者仍然遗漏了一个问题:这些东西有什么用?

事实上,每个数据结构都可以被认为是现实生活对象的表示。为什么会有栈?因为有很多场景需要FIFO。更本质的是,在这些场景中,先进需要包括落后才能完成。例如,C 语言函数的调用栈,逆序的表达式求值。或者在生活中,如果我们要拆解一台电脑,我们必须先打开它的机箱,然后拆掉大部件,最后再去掉大部件中的小部件。如果我们要组装回来,我们会先放小的,然后是大的,这里有一个订单。可以说学校c语言用什么软件,当我们拆机时,各个部件组成一个堆栈,外壳在堆栈的底部,内部的小部件在堆栈的顶部。当然,在修电脑的时候,我可以把所有的零件都乱七八糟地扔在床上,需要安装的时候再找,而不是排成一排。为什么?因为当我完成第k步时,我心里就知道第k+1步需要哪一部分。在写程序的时候,比如求逆表达式的值,我无法知道下一个“部分”是什么,只能猜测栈顶元素。因此,在实际程序中,它必须是有序的。这就是堆栈,一种数据结构,出现的地方,它是一种抽象。本质上,这也是一个信息问题。我心里很清楚第 k+1 步需要哪一部分。在写程序的时候,比如求逆表达式的值,我无法知道下一个“部分”是什么,只能猜测栈顶元素。因此,在实际程序中,它必须是有序的。这就是堆栈,一种数据结构,出现的地方学校c语言用什么软件,它是一种抽象。本质上,这也是一个信息问题。我心里很清楚第 k+1 步需要哪一部分。在写程序的时候,比如求逆表达式的值,我无法知道下一个“部分”是什么,只能猜测栈顶元素。因此,在实际程序中,它必须是有序的。这就是堆栈,一种数据结构,出现的地方,它是一种抽象。本质上,这也是一个信息问题。

其他数据结构,如队列、树、哈希表等,也可以看作是对现实生活中事物如何工作的描述。比如树就是一个非常典型的递归结构,想想中世纪欧洲的封建制度,原则是“我只需要对我下面的人发号施令”。所谓二叉树,它的特殊性是它是树的最简单形式,一个节点有两个子节点的情况是生活中最常见的。例如,我们的四个算术运算可以用一棵树来表示。嗯,说到四次算术运算,我们可以把普通的中序表达式转换成逆序表达式,本质上就是把二叉树变成栈,感受一下算法。

更实用一点?

事实上,如果只是问题本身,我想我不需要说那么多。个人感觉我们学校的软学院对新生的C语言考试要求不高(可能是我们学校太渣吧?)。学期末,电脑上有三个问题。第一个问题没有脑子。第二题需要考很多C语言的语法内容。第三个问题将涉及数据结构。数据。因此,如果你的目标只是通过考试并取得好成绩,那么可能没有必要花那么多时间看这些“有的事和无事的事”。以下答案中提到的一些事情,大概是从从事C开发的专业人士的角度来解释的。作为一个新生,其实你和我一样,你不 不知道你以后会从事什么样的工作,也许你可能会去前端。我绝对不相信一个对操作系统不太了解的大学生真的能像一些人说的那样去啃APUE,更不用说一个连C编程和Linux操作都不熟悉的人了,对吧?

如果你的学校没有脑力去给C的学生做笔试,而且你用的是谭浩强的课本,我想你可以把它扔掉,真的。当然,谭先生为我国计算机的普及做出了很大的贡献。但是现在是2015年,学校还在用这本书。我觉得这不是谭浩强的耻辱,而是学校的耻辱!C Primer Plus这本书我没看过,写这个答案的时候在学校图书馆翻阅了一下,感觉还可以。如果您学习计算机,请不要害怕这些书籍。厚并不一定意味着难以阅读。大学课堂老师一个学期不能教太多的内容,大部分都得自学。好老师只能给学生最积极的引导,

在这个时代,大学生可以接触到的项目很多,主要类型无外乎是Web相关的,而且大多不使用C语言。但不要因此而否定 C/C++ 的价值。知乎上的大牛们都说了很多。

另外,请记住,C 和 C++ 是两种语言,C++ 与 C 并不完全兼容。你相信吗?尝试分别在 C 和 C++ 中输出 sizeof(‘Z’) 。

推荐书目

代码:计算机硬件和软件的隐藏语言

信息:历史、理论、洪水

头先 C

C 编程:一种现代方法

C 编程语言

计算机系统:程序员的视角

专家 C 编程:深度 C 的秘密

C 上的指针

C 陷阱和陷阱

(题主可以看看我的拙作

指南

)

(答主也是大一新生,嘿嘿,表达不准确的还请指出,但请轻喷……)

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论