学会了C语言真的可以开发出很多东西吗?

发表于:2016-2-29 09:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:知乎    来源:51Testing软件测试网采编

  【导读】:本文综合整理自知乎的同名问答贴,题主还补充:
  我现在C语言入门,基本靠自学,就看网上的那种教程,但是我怎么觉得它就是只能做下数学题,我觉得它并不能编辑出一个啥子游戏或者软件出来噢……初学者,见谅。
  下面是 涛吴 的回答分享。
  马里奥碰到花朵就变身。
  什么是马里奥?一个装着 16 × 32 个小色块的长方形,其中一些色块填着颜色,另一些没有。什么是花?一个 16 × 16 的正方形。什么是「变身」?把马里奥这个方块里面代表衣服的褐色变成红色,代表背带裤的红色变成白色。什么是褐色?暂且说它是 0×887000 这个数字。什么是「碰到」?马里奥的长方形与花朵的正方形有所重叠。什么是「重叠」?假设马里奥的这个方块占据屏幕(什么是屏幕?一个能装下 256 × 240 个小色块的矩形)中 X 方向 101 到 116、Y 方向 21 到 52 之间的区域,那么只要这个区域内有一点或更多点也被花朵所占据(比如花朵处在 X 116 到 131、Y 21 到 36 之间的区域内),我们就认为两者有所重叠。
  若给定以八个数值代表的两个矩形区域,请写出判断两个区域是否有重叠的 C 语言程序。如果你能写出来,那么祝贺你,如果有朝一日你想自己做一遍 NES 版本的《超级马里奥》,你至少知道让他变身需要做什么了。
  是的,C 语言也许「只能」做数学题。可是,绝大多数游戏的运行过程就是不停地做数学题,而所谓编写游戏,也就是把游戏的规则和游戏的效果转化为数学题而已。其中不少题目电脑都已经知道怎么解——是别的程序员事先告诉它的——比如「求一堆散落在三维直角座标系之中的多面体在 8(x?3)?10(y+1)?11(z?1)=0 这个平面上一个给定范围内的投影」或者「给定一些彼此相连的顶点,求任意两点之间的最短路径」之类的数学题,它只需要千万分之一秒就能给你解好。这种能力有什么用?电脑上 FPS 游戏的本质活动就是不停地求三维座标系下的多面体经过变换之后在二维平面上的投影,不停地判断两个多面体是否彼此重叠,以及不停地寻找两个顶点之间的最短路径,最终达到让怪物冲到你面前咬你一口的目的。不止游戏如此,其他软件也都差不多,每一个细节都是某种数学题——比如知乎页面顶端的蓝色导航条背景,就是 CSS 描述的一个浅蓝到深蓝的渐变——渐变是怎么回事呢?给出两个数字分别代表两种颜色,以及第三个数字代表一段距离,求一系列颜色的数值以及次序,使得这段距离中两种相邻颜色之间的变化最小。数学题。别说 C 语言,一切编程语言最终都只能做数学题,根据给定的数据,算出另一些数据,算出更多的数据,然后存贮、发送或者呈现算出的数据。
  不过我能理解你的困惑。投入大量时间看完教程,结果只能在黑框里输出一串数字。这是在学编程还是在向七十年代致敬?编程是这样无法给人成就感的活动吗?是,也不是。看你的表述,应该不是小孩子了,因为小孩子不会因为初学编程能做的事情很少而没有成就感,或者说,觉得这样做没有成就感的小孩子根本不会继续学下去。最初学编程的成就感单纯来自于「我居然可以指挥机器做一些事」,至少我小时候用中华学习机编一个程序帮我算暑假作业上的四则运算题时是这样感觉的。写出这些程序并用它解题虽然远比自己动笔去把题目算出来费时,却让人乐此不疲。那时候我还不知道马里奥碰到花会变身这种事情其实也是靠编程编出来,所以我也不会去想学编程「并不能做什么」。
  无奈大多数人过了一定年纪就很难再靠「我能指挥机器」这种简单原始的快乐来驱动自己学编程。见过世面,听过传言,欲望和野心变得复杂而庞大,你想要图形界面,音乐音效,人工智能,云端同步,可是你闷头学了几堂课,还是只学会在黑框里显示一串数字。你怀疑这是学 C 语言的错,于是你到知乎上来问了这个问题。
  你的疑惑是有道理的。
  如果能把编程学下去,日后你就会明白,任何程序都是一座冰山,最终用户能看到的界面和使用的功能,只是程序浮在水面上的十分之一。知乎这个网站其实也是个运行在某台电脑上的程序,你能看到的十分之一是用什么编写的呢?HTML,CSS,JavaScript,或者 Objective-C。而你看不到的那十分之九是用什么编写的呢?Python。这些你无法直接观测到的 Python 程序运行在世界某个角落的某些计算机上,隔着光缆、双绞线和无线基站,为你面前或掌上的用户界面注入生命。
  <img src=”https://pic2.zhimg.com/4e6c238477813abd5335d7bf51b54c15_b.jpg” data-rawwidth=”518″ data-rawheight=”588″ width=”518″ data-original=”https://pic2.zhimg.com/4e6c238477813abd5335d7bf51b54c15_r.jpg”>
  ( http://xkcd.com/353/ )
  ……可是 Python 是用什么编写的呢?C 语言(当然,这么说并不严谨,Python 理论上可以用任何其他语言实现,实际上也已经被用很多其他语言实现了,不过这并不是重点)。任何编程语言都是实现某个功能的工具,Python 实现了知乎这个网站的大部分功能,而 C 实现了「用 Python 写程序」这个功能。为什么是 C?
  C 很别扭又缺陷重重,却异常成功。固然有历史的巧合推波助澜,可也的确是因为它能满足对于这样一种系统实现语言的需要:既有相当的效率来取代汇编语言,且又足够地抽象而流畅,能够用于描述各种各样的环境之下的算法与交互。
  C is quirky, flawed, and an enormous success. Although accidents of history surely helped, it evidently satisfied a need for a system implementation language efficient enough to displace assembly language, yet sufficiently abstract and fluent to describe algorithms and interactions in a wide variety of environments.
  ——C 语言之父,Dennis M. Ritchie
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号