作为非计算机专业的学生,觉得 C 语言远比其他语言易于上手,正常吗?
链接: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 语言远比其他语言易于上手,正常吗?的更多相关文章
- 学java编程软件开发,非计算机专业是否能学
近几年互联网的发展越来越好,在国外,java程序员已经成为高薪以及稳定职业的代表,虽然国内的有些程序员很苦逼,但是那只是少数,按照国外的大方向来看,程序员还是一个很吃香的职业.根据编程语言的流行程度, ...
- 编程入门选什么语言好?C 语言还是Python ?为你解析
前面我分享过计算机行业已经成了学校选择排名第一,家长和学生都很看好计算机类专业.现在IT行业也越来越火爆,程序员越来越被人看好.面对相比同龄人高薪资的诱惑,人们很难不心动,即使秃头也值得! 那么问题来 ...
- 【R语言入门】R语言中的变量与基本数据类型
说明 在前一篇中,我们介绍了 R 语言和 R Studio 的安装,并简单的介绍了一个示例,接下来让我们由浅入深的学习 R 语言的相关知识. 本篇将主要介绍 R 语言的基本操作.变量和几种基本数据类型 ...
- 为什么可以说Java语言是准动态语言?
什么是动态语言? 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如JavaScript便是一个典型的动态语言. 除此之外如Ruby.Python ...
- JNI学习2:android 调用C语言方法与C语言调用android方法
#include <jni.h> #include <stdio.h> #include <stdlib.h> #include <jni.h> #in ...
- 【实习记】2014-08-19升级vim配置YouCompleteMe并debug的过程+qtcreator有语言包没法换语言
做了个小项目,有空闲可以做点事了. 偶然查资料看见YouCompleteMe的鼎鼎大名. 演示demo <img src="http://i.imgur.com/0OP4ood ...
- SQL语言学习-数据定义语言
Sql语言至今已经有6个版本.SQL查询语言包括了所有对数据的操作命令,这些操作可分为四类:数据定义语言(DDL).数据操纵语言(DML).数据控制语言(DCL)和嵌入式SQL语言. 数据定义语言(D ...
- 01 C语言程序设计--01 C语言基础--第1章 C语言概述&第2章 GCC和GDB
走进嵌入式开发的世界,企业级项目课程让你达到企业嵌入式应用开发要求.名师在线答疑,解决疑难.科学评测体系,系统评估学习.核心项目实........ 30 门课程 241小时12分钟 824 人学习 学 ...
- 别致的语言GO(GO语言初涉)
最近由于各种原因(好吧,其实是犯懒)已经许久没有再写新的博文了!最近正好在学习一门新的语言,所以正好记录一下自己的学习成果!最近利用每天晚上下班回来后的几小时,学习了Google开发的Go语言,算是对 ...
随机推荐
- oracle中实现自增id
在一些数据库(例如mysql)中,实现自增id只要在建表的时候指定一下即可, 但是在oracle中要借助sequence来实现自增id, 要用上自增id,有几种方式: 1.直接在insert语句中使用 ...
- hive中安装hive_utils模块
1. 因为在linux部署的python 3.6 在安装模块的时候遇到了许多问题,所以使用linux中的python3.6环境 2. 首先使用pip安装 hive_utils 模块sudo pip i ...
- linux正则
正则表达式 分两类: 基本正则表达式:BRE 扩展正则表达式:ERE :grep -E, egrep 正则表达式引擎: 采用不同算法,检查处理正则表达式的软件模块 PCRE(Perl ...
- Rpgmakermv(16) YEP MainmenuManager
---------------------------------------------------------------------------------------------------- ...
- Rower Bo (高数 + 物理)
#include<bits/stdc++.h> #define esp (1e-5) using namespace std; int main(){ int a; double v1, ...
- Solid Dominoes Tilings (轮廓线dp打表 + 容器)
第一步先打一个表,就是利用轮廓线DP去打一个没有管有没有分界线组合数量的表 #include<bits/stdc++.h> using namespace std; ; <<; ...
- Spark学习之路 (十七)Spark分区
一.分区的概念 分区是RDD内部并行计算的一个计算单元,RDD的数据集在逻辑上被划分为多个分片,每一个分片称为分区,分区的格式决定了并行计算的粒度,而每个分区的数值计算都是在一个任务中进行的,因此任务 ...
- caffe_ssd学习-用自己的数据做训练
几乎没用过linux操作系统,不懂shell编程,linux下shell+windows下UltraEdit勉勉强强生成了train.txt和val.txt期间各种错误辛酸不表,照着examples/ ...
- 设计模式之Prototype(原型)(转)
定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传 ...
- 大数据和hadoop的一些基础知识
一.前言 大数据这个概念不用我提大家也听过很多了,前几年各种公开论坛.会议等场合言必及大数据,说出来显得很时髦似的.有意思的是最近拥有这个待遇的名词是“人工智能/AI”,当然这是后话. 众所周知,大数 ...