C语言不简单,连程序员都这么说,为什么呢?
之前在大学那会学的第一门语言就是C语言了,大家应该跟我相同吧,只要是专业用得到语言的,应该都学过C语言吧,可能大家一致认为C最基础最简单,当然要先学它了,事实并非如此,其实我认识的好多程序员大神都在吐槽C多难多难学,事实亦是如此,可能C语言的语法很简单,适合初学者作为入门来学,但是呢,要是把它用于开发之中,却是格外的复杂了,本文将详细介绍。apache php mysql
begin!
底层的 == 好的?
C语言提供了对底层的操作,比如指针。但是C语言跟C++最大的不同就是,C语言避不开指针,而C++和用STL和智能指针库完全避开它。也即是说,其它语言的指针只是个类型,C语言的指针就是指针。我一向认为,初学者过早接触指针是个大忌。初学者需要的是做出各种好玩的应用,以此来产生即时反馈,而不是深入研究计算机系统,因为后者只会消磨掉他们的信心。初学者就应该专注于代码逻辑,并且屏蔽掉和底层打交道的一切事物。这么做个比喻吧,如果你刚学化学的时候,就给你讲元素周期律和VSEPR模型,你会感兴趣吗?
暴露底层从另外一个角度来说也是有害的,这涉及到手动管理堆中内存。计算机讲究的是一个权衡,你可以说这种方式执行效率高,但是大多数情况下,过度追求执行效率而忽视开发效率是不对的。手动管理内存是高级程序员的事情,初级程序员就应该完全交给语言所带的特性来管理内存,否则,你的程序三天出一个空指针异常,五天出一个内存泄漏,这谁受得了?所以c语言无论从哪点来说,都不适合拿来入门。
小编给大家推荐一个学习氛围超好的地方,C/C++交流企鹅裙:341636727!适合在校大学生,小白,想转行,想通过这个找工作的加入。裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直播课程
还有一种看法是,只有c语言能接触到栈和堆的模型。我很负责任的告诉你,所有非脚本的编译语言,比如c++和swift,以及托管语言,比如c#和java,都能接触到栈和堆的模型,而且由于有了自动内存管理机制,后者使用堆的频率要远远高于C。脚本语言也有自己的变量容器模型,比如php的zval。这个锅不应该由编程语言来背,而是应该由国产的垃圾教材来背。也可以看出来,c语言的堆栈模型不是放之于四海皆准的,如果拿它去套在其它语言上,可能就行不通。可有些人非要拿它当作学习其他编程语言的基础,真是可笑。
简单的代价
C语言不提供一些通用组件的高级封装和抽象。比如哈希表,你用的时候完全就得自己造一个,或者上网搜搜看有没现成的代码。这就对开发者很不友好了。由于C语言标准库里面没有这个东西,学的时候完全不会提及,这就导致很多人甚至都不知道有这么个东西,遇到问题的时候就只能干瞪眼了。C语言仅仅支持的容器是原生数组,字符串是用原生字符数组实现的,于是对字符串的处理就非常非常弱。你要是想写个字符串拼接的代码,java里要一行,c语言要好几行。这也就是c语言“简单”带来的代价。
C语言的简单恰恰是省略掉了OO的原生支持换来的。我上面为什么说是原生支持,是因为C语言还是可以用组合的方式实现OO的,比如继承用组合实现,虚函数用指针函数成员来实现,等等。在OO的方面,C语言实现起来要比C++难得多。C++的一个关键词,对应到C语言又是几行代码,何谈简单呢?OO好也罢,坏也罢,它是现在业界通用的语言范式,其作用就像自然语言中的英语一样,举足轻重。如果不接触一下这个,以后找工作的时候就很吃亏。但是OO真的复杂吗?这些东西,你如果去翻java的书,顶多花两章介绍,一章是类,一章是接口。其它不那么OO的语言干脆就花一章了,就是告诉你有个class,而这些篇幅也差不多是C语言教程中结构和枚举的篇幅。
C语言的“简单”,就意味着实际开发中,你需要做更多的手动操作来代替编译器。我想上帝是公平的,给了其它语言更多的语言特性,就会同时给他们更高的开发效率。
再谈谈标准库
C语言书薄的原因,不是因为没有OO那些东西,而是标准库中缺少一些现代化的组件,这些东西可都在posix里。离开posix api谈C语言,就是耍流氓。通用的组件或设施,到了c语言这边,一个都不会少,因为现代的程序运行环境和需求,你离了这些东西,就根本写不出什么来。现代编程语言的五大库(字符串、容器、io、线程、网络),c语言就坑掉两个了。至于后面那两个,C语言开发者不得不去使用posix api,然后再去解决api不兼容问题。以C语言标准库的德性,离了posix就是半残。而如果要了解posix,就得看《apue》。你如果跟我说C语言简单,看完《apue》那一大厚本书,再跟我说简单吧。
不是后记的后记
我们学一门编程语言并不是要拿来应付考试,而是要实际做东西的。像C语言这种没有容器、没有string、没有模板、没有异常、没有RAII,所有轮子自己造,毫无现代编程语言特性的语言,真正用的时候复杂到爆。抱歉,我没有时间去研究每个特性或者类在C语言里怎么实现,我还是喜欢用更简短的代码来表达我的逻辑。
end:
看完到这里你看出哪里简单呢?写玩具程序简单吗?反正我觉得好复杂的样子,并不像我大学学时的样子啊,亦有可能我那时学习了假的C语言。
相关文章:
相关视频:
Atas ialah kandungan terperinci C语言不简单,连程序员都这么说,为什么呢?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Struktur Data Bahasa C: Perwakilan data pokok dan graf adalah struktur data hierarki yang terdiri daripada nod. Setiap nod mengandungi elemen data dan penunjuk kepada nod anaknya. Pokok binari adalah jenis pokok khas. Setiap nod mempunyai paling banyak dua nod kanak -kanak. Data mewakili structtreenode {intData; structtreenode*left; structtreenode*right;}; Operasi mewujudkan pokok traversal pokok (predecision, in-order, dan kemudian pesanan) Node Node Carian Pusat Node Node adalah koleksi struktur data, di mana unsur-unsur adalah simpul, dan mereka boleh dihubungkan bersama melalui tepi dengan data yang betul atau tidak jelas yang mewakili jiran.

Kebenaran mengenai masalah operasi fail: Pembukaan fail gagal: Kebenaran yang tidak mencukupi, laluan yang salah, dan fail yang diduduki. Penulisan data gagal: Penampan penuh, fail tidak boleh ditulis, dan ruang cakera tidak mencukupi. Soalan Lazim Lain: Traversal fail perlahan, pengekodan fail teks yang salah, dan kesilapan bacaan fail binari.

Fungsi bahasa C adalah asas untuk modularization kod dan bangunan program. Mereka terdiri daripada pengisytiharan (tajuk fungsi) dan definisi (badan fungsi). Bahasa C menggunakan nilai untuk lulus parameter secara lalai, tetapi pembolehubah luaran juga boleh diubahsuai menggunakan lulus alamat. Fungsi boleh mempunyai atau tidak mempunyai nilai pulangan, dan jenis nilai pulangan mestilah selaras dengan perisytiharan. Penamaan fungsi harus jelas dan mudah difahami, menggunakan nomenclature unta atau garis bawah. Ikuti prinsip tanggungjawab tunggal dan pastikan kesederhanaan fungsi untuk meningkatkan kebolehkerjaan dan kebolehbacaan.

Bagaimana untuk mengeluarkan undur di C? Jawapan: Gunakan pernyataan gelung. Langkah -langkah: 1. Tentukan pembolehubah N dan simpan nombor undur ke output; 2. Gunakan gelung sementara untuk terus mencetak n sehingga n adalah kurang dari 1; 3. Dalam badan gelung, cetak nilai n; 4. Pada akhir gelung, tolak n dengan 1 untuk mengeluarkan timbal balik yang lebih kecil seterusnya.

Algorithms are the set of instructions to solve problems, and their execution speed and memory usage vary. In programming, many algorithms are based on data search and sorting. Artikel ini akan memperkenalkan beberapa algoritma pengambilan data dan penyortiran. Carian linear mengandaikan bahawa terdapat array [20,500,10,5,100,1,50] dan perlu mencari nombor 50. Algoritma carian linear memeriksa setiap elemen dalam array satu demi satu sehingga nilai sasaran dijumpai atau array lengkap dilalui. Carta aliran algoritma adalah seperti berikut: kod pseudo untuk carian linear adalah seperti berikut: periksa setiap elemen: jika nilai sasaran dijumpai: pulih semula benar-benar pelaksanaan bahasa palsu c: #termasuk #termasukintmain (tidak sah) {i

C Language Multithreading Programming Guide: Mencipta Threads: Gunakan fungsi pthread_create () untuk menentukan id thread, sifat, dan fungsi benang. Penyegerakan Thread: Mencegah persaingan data melalui mutexes, semaphores, dan pembolehubah bersyarat. Kes praktikal: Gunakan multi-threading untuk mengira nombor Fibonacci, menetapkan tugas kepada pelbagai benang dan menyegerakkan hasilnya. Penyelesaian Masalah: Menyelesaikan masalah seperti kemalangan program, thread stop responses, dan kesesakan prestasi.

Petua Penyelesaian Masalah Untuk fail pemprosesan bahasa C Apabila memproses fail dalam bahasa C, anda mungkin menghadapi pelbagai masalah. Berikut adalah masalah biasa dan penyelesaian yang sepadan: Masalah 1: Tidak dapat membuka kod fail: fail*fp = fopen ("myfile.txt", "r"); jika (fp == null) {// pembukaan fail gagal} charbuffer [100]; size_tread_bytes = fread (buffer, 1, siz

F Fungsi bahasa adalah blok kod yang boleh diguna semula. Mereka menerima input, melakukan operasi, dan hasil pulangan, yang secara modular meningkatkan kebolehgunaan dan mengurangkan kerumitan. Mekanisme dalaman fungsi termasuk parameter lulus, pelaksanaan fungsi, dan nilai pulangan. Seluruh proses melibatkan pengoptimuman seperti fungsi dalam talian. Fungsi yang baik ditulis mengikut prinsip tanggungjawab tunggal, bilangan parameter kecil, penamaan spesifikasi, dan pengendalian ralat. Penunjuk yang digabungkan dengan fungsi dapat mencapai fungsi yang lebih kuat, seperti mengubahsuai nilai pembolehubah luaran. Pointer fungsi meluluskan fungsi sebagai parameter atau alamat kedai, dan digunakan untuk melaksanakan panggilan dinamik ke fungsi. Memahami ciri dan teknik fungsi adalah kunci untuk menulis program C yang cekap, boleh dipelihara, dan mudah difahami.
