作者:invalid s
链接:https://www.zhihu.com/question/26659552/answer/615531516
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

不错,是个程序员料子。

没错,C的确比诸如C++、Java、python之类语言简单。

因为它什么都没有:32个关键字9种控制语句,然后是加减乘除与或非之类直接从数学里借来的若干运算符。没了。

简洁明了,自解释性强,正交度高,一个个概念搞清楚了,那真是做什么都简单。

相比之下,其他语言往往会引入更多的概念;这些概念往往还做不到“正交”,关系复杂,规则层出不穷;经常还极不直观……

对于跟着课本/教材亦步亦趋的初学者来说,当然是概念简单清晰、逻辑关系直白、在达成基本数据结构/算法这个目标上不带任何逻辑包袱的C更简单,更容易入门。


请注意我加粗的“跟着课本/教材亦步亦趋的初学者”这个限定。

一旦脱离了这个限定,第一段的讨论就成了无的放矢了。

这是因为,一旦你真的需要写点什么实用的东西出来,你就不得不面对“现实的复杂性”。

比如说吧,最简单的,见过电脑的bios界面吗?如果让你用C写个类似的东西呢?

类似的,如果让你写个视频解码器音频播放器呢?

你立刻就会发现,你必须面对如下问题:

1、你必须懂硬件原理(显示器原理、显存/屏幕空间的映射关系、硬盘存储寻道原理、音频采样/插值原理等等;以及CPU寄存器、流水线、cache、总线、锁等等等等)。

2、你不得不使用第三方库——比如,为了写一个bios式的界面,最省事的办法是用ncurses库。

3、其他语言直接提供给你的东西,你将不得不全部重新实现一遍——更加的笨拙,更加的不正交——粗糙的完全无法使用。

C要求,这1、2、3三点你必须全能。

它的库往往更原始,缺乏抽象,经常需要你根据自己的实际情况随手补全;

它要求你对硬件了如指掌:每条指令下去,从CPU标志位到内存到总线到显卡声卡,所造成的一切直接间接后果,你必须如数家珍、并把程序执行时每个实体的每个瞬间都安排的明明白白——哪怕状态变化的时序出现问题,那都是无法接受的严重bug;

最后,你需要自己就能够为python之类语言实现/改良它的字典,这才可能在C里面造一个不能被编辑器/编译器直接支持的类似物、然后还要把它用到自己的项目里。

相比之下,其他语言不需要你了解1,它甚至禁止你过于了解硬件,从而避免你被硬件的复杂性所影响;

它们有丰富完善好用的2,它们的库从一开始就是针对傻瓜用户设计的,用错了它甚至能给你提示;

你只需学会它们的3的用法、并不需要自己懂这些“神秘语言元素”的实现:你压根不需要像用C时一样,自己绞尽脑汁用最少的指令实现这类语言提供的基本设施——越是基本的设施越是值得字斟句酌:用python你可以直接用“字典”;但如果玩C,你得知道“字典”就是C里面你要自己实现的“哈希表”;而且并不是课本上的“玩具代码”,而是实实在在工业强度的、最优化的、支持一切key-value类型的、高度泛化的哈希表。

可见,哪怕你对C对数据结构有那么一丁点最粗浅的了解,你都绝不会用“python有字典”来证明它的难、证明C的易用——恰恰相反,学C的目标之一,正是为python实现字典、实现“无需区分变量类型的变量”、帮助初学者“不知道指针照样能用内存写程序因为我在后台偷偷替他们做了嘿嘿哈哈……”

换句话说,题主完全不知道想用好C需要什么。

你所罗列的、其他语言“难”的那些方面,恰恰证明了你对用好C需要哪些基础知识一无所知。

因为学其它语言只需要知道如何用字典之类东西就够了;而学C,你不仅得自己能实现字典(及其他),还得能推而广之,因地制宜的设计出“字典”的各种类似体、变形体。

作为非计算机专业的学生,觉得 C 语言远比其他语言易于上手,正常吗?的更多相关文章

  1. 学java编程软件开发,非计算机专业是否能学

    近几年互联网的发展越来越好,在国外,java程序员已经成为高薪以及稳定职业的代表,虽然国内的有些程序员很苦逼,但是那只是少数,按照国外的大方向来看,程序员还是一个很吃香的职业.根据编程语言的流行程度, ...

  2. 编程入门选什么语言好?C 语言还是Python ?为你解析

    前面我分享过计算机行业已经成了学校选择排名第一,家长和学生都很看好计算机类专业.现在IT行业也越来越火爆,程序员越来越被人看好.面对相比同龄人高薪资的诱惑,人们很难不心动,即使秃头也值得! 那么问题来 ...

  3. 【R语言入门】R语言中的变量与基本数据类型

    说明 在前一篇中,我们介绍了 R 语言和 R Studio 的安装,并简单的介绍了一个示例,接下来让我们由浅入深的学习 R 语言的相关知识. 本篇将主要介绍 R 语言的基本操作.变量和几种基本数据类型 ...

  4. 为什么可以说Java语言是准动态语言?

    什么是动态语言? 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如JavaScript便是一个典型的动态语言. 除此之外如Ruby.Python ...

  5. JNI学习2:android 调用C语言方法与C语言调用android方法

    #include <jni.h> #include <stdio.h> #include <stdlib.h> #include <jni.h> #in ...

  6. 【实习记】2014-08-19升级vim配置YouCompleteMe并debug的过程+qtcreator有语言包没法换语言

        做了个小项目,有空闲可以做点事了. 偶然查资料看见YouCompleteMe的鼎鼎大名. 演示demo <img src="http://i.imgur.com/0OP4ood ...

  7. SQL语言学习-数据定义语言

    Sql语言至今已经有6个版本.SQL查询语言包括了所有对数据的操作命令,这些操作可分为四类:数据定义语言(DDL).数据操纵语言(DML).数据控制语言(DCL)和嵌入式SQL语言. 数据定义语言(D ...

  8. 01 C语言程序设计--01 C语言基础--第1章 C语言概述&第2章 GCC和GDB

    走进嵌入式开发的世界,企业级项目课程让你达到企业嵌入式应用开发要求.名师在线答疑,解决疑难.科学评测体系,系统评估学习.核心项目实........ 30 门课程 241小时12分钟 824 人学习 学 ...

  9. 别致的语言GO(GO语言初涉)

    最近由于各种原因(好吧,其实是犯懒)已经许久没有再写新的博文了!最近正好在学习一门新的语言,所以正好记录一下自己的学习成果!最近利用每天晚上下班回来后的几小时,学习了Google开发的Go语言,算是对 ...

随机推荐

  1. (转)使用yuicompressor-maven-plugin压缩js及css文件(二)

    本文介绍通过使用yuicompressor-maven-plugin插件实现js及css代码的自动压缩,方便集成到持续集成环境中,如jenkins. 一.配置yuicompressor-maven-p ...

  2. UML之状态机图

    状态机图 基本概念: 状态机图,UML 1.x规范中称状态图,是一个展示状态机的图. 状态机图基本上就是一个状态机中元素的投影,这也就意味着状态机图包括状态机的所有特征.状态机图显示了一个对象如何根据 ...

  3. STL之Queue容器

    1.Queue容器 1)queue是队列容器,是一种“先进先出”的容器. 2)queue是简单地装饰deque容器而成为另外的一种容器. 3)头文件.#include <queue> 2. ...

  4. Unity 异步加载进度条

    public class View_LoadingScene : MonoBehaviour { //场景加载进度条对象 public GameObject loadingProgressBar; / ...

  5. 获取数据库连接对象Connection

    2018-11-04  19:50:52 开始写 public Connection getConn() {//返回类型为Connection try { Class.forName("co ...

  6. 【2017-03-20】HTML基础知识,标记,表格,表格嵌套及布局,超链接

    一.HTML  网站(站点),网页基础知识 HTML是一门编程语言的名字:超文本标记语言 可以理解为:超越了文本的范畴,可以有图片.视频.音频.动画特效等其他内容,用标记的方法进行编程的计算机语言 基 ...

  7. 刨根究底字符编码之—UTF-16编码方式

    在网上已经转悠好几天了, 这篇文章让我知道了UTF-16的前世今生, 感谢作者https://cloud.tencent.com/developer/article/1384687 1. UTF-16 ...

  8. ID3决策树

    决策树 优点:计算复杂度不高,输出结果易于理解,对中间值的缺少不敏感,可以处理不相关特征数据 缺点:过拟合 决策树的构造 熵:混乱程度,信息的期望值 其中p(xi)是选择分类的概率 熵就是计算所有类别 ...

  9. HTTPS 之共享秘钥 公钥 及 私钥

    HTTPS 之共享秘钥 公钥 及 私钥一 共享秘钥1.1 概念共享秘钥和我们生活中同一把锁的钥匙概念类似,对同一把锁来说,加锁时使用什么钥匙,解锁也必须使用同样的钥匙. 1.2 共享秘钥在HTTP传输 ...

  10. Linux基础命令---检查密码文件pwck

    pwck 检查用户密码文件“/etc/passwd”和“/etc/shadow”的完整性,将验证结果送到标砖输出.提示用户删除格式不正确或有其他不可更正错误的条目.检查以验证每个条目是否具有:正确的字 ...