作为非计算机专业的学生,觉得 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语言,算是对 ...
随机推荐
- smtp常见问题
http://blog.csdn.net/chenfei_5201213/article/details/10138969
- 设计模式之State(状态)(转)
State的定义: 不同的状态,不同的行为;或者说,每个状态有着相应的行为. 何时使用? State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif ...
- loadRunner手动关联, web_reg_save_param_regexp()函数正则匹配字符,赋值给变量
loadRunner写脚本实现登录机票网站,手动关联,获取页面源码中特定字符 手动关联,就是通过函数获取某个步骤生成的字符,赋值给一个变量,这个变量可以作为接下来某个步骤的输入, 以便这个脚本能够在存 ...
- android使用inject需要注意的地方
android使用inject需要注意的地方1.viewmodel里面添加注解@Inject FavoritesDBManager mFavoritesDBManager; 2.Component里面 ...
- vue 组件之间 的通信
组件之间通信: 同级组件之间通信:两个组件定义应用到同一个vue实例之下: <div id="webapp" class="box"> & ...
- IDEA添加作者和时间信息
- Kattis之旅——Prime Path
The ministers of the cabinet were quite upset by the message from the Chief of Security stating that ...
- The logback manual #02# Architecture
索引 Logback's architecture Logger, Appenders and Layouts Effective Level(有效等级)又名Level Inheritance Ret ...
- django的url配置
在一个请求到达的时候,最先达到的就是视图层,然后根据url映射到视图函数.这一部分我们来说明url的配置. 概述 为了给一个应用设计URL,你需要创建一个Python 模块,通常称为URLconf(U ...
- Zookeeper注册中心的搭建
一.Zookeeper的介绍 Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用 ...