作为非计算机专业的学生,觉得 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语言,算是对 ...
随机推荐
- Yii Restful api认证
- [转] LoadRunner 获取接口请求响应信息
Action() { int nHttpRetCode; // 默认最大长度为256,get请求需注意缓存问题,需要根据content-length进行修改 web_set_max_html_para ...
- Java基础(basis)-----异常与错误处理
1.编译型异常和运行时异常 编译时异常是指程序正确 而由外界条件不满足而产生的异常 java 中要求必须去捕捉住这类异常 不然无法通过编译 运行时异常是指程序存在着bug 如空指针异常 数 ...
- Game (思维)
#include<bits/stdc++.h> using namespace std; ; char str[maxn][maxn]; int cntx[maxn], cnty[maxn ...
- python csv文件转换成xml, 构建新xml文件
csv文件 code from xml.etree.ElementTree import Element,ElementTree,tostring import json,csv def csvtox ...
- div居中与div内容居中,不一样
1.div自身居中 使用margin:0 auto上下为0,左右自适应的css样式. 要让div水平居中,那么除了设置css margin:0 auto外,还不能再设置float,不然将会导致div靠 ...
- HDU 1879 继续畅通工程(最小生成树)
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经 ...
- 4、CentOS6.5下安装php5.3
操作系统:CentOS6.5 环境:Apache2.2安装成功.可查看:http://www.centoscn.com/image-text/install/2014/0505/2910.html M ...
- LINUX部署SVN服务器
1.安装SVN服务端 yum install -y subversion 2.创建svn版本库 mkdir -p /data/svn/myproject svnadmin create /data/s ...
- Linux(64) 下 Tomcat + java 环境搭建
查看 linux 系统位数 getconf LONG_BIT java JDK下载地址: http://download.oracle.com/otn-pub/java/jdk/8u181-b13/ ...