作者的话部分
以下部分尚未整理得富有条理。
C语言,覆盖了数据、语句、操作符、表达式、指针、函数、数组、字符串、结构和联合等等C语言话题。
C可以独特地实现一些任务,如直接访问硬件。优秀C程序的效率几乎和汇编语言程序一样高,但明显C更加易于开发。
C缺乏一部分安全网特性,对数组下标和指针访问不做有效检查,但可以自己多写一段规避这类问题。
C给予程序员更多控制权,用来控制数据的存储位置和初始化过程。
丰富的操作符集合方便执行底层的计算,如移位和屏蔽等,方便C成为实现操作系统和嵌入性控制器软件的良好选择。
基于我对其他语言的优缺点并不了解,目前还无法体会出C在部分编辑效果上的优劣。
C语言最早被开发出来的时候,可以当作使用的标准是K&R C标准,非常老。之后国际组织发表的ANSI C(或称C89、C90,可以理解为同一标准),提高了C语言在不同机器上的可移植性,标准化必然带来这种结果。
但C89和C99之间就有明显的差别了,有些编译情况下会报错,需要我今后增加实践。如果碰到老式的编译器,我需要拥有同样能辨别使用的能力。
优秀的C++书籍把经历集中于面向对象模型有关的课题上(如类的设计),而不是再复述一遍基础的C技巧,这才是对的。
什么是基础呢?就是要把我们大学所学的离散数学,算法与数据结构,操作系统,计算机体系结构,编译原理等课程学好,对计算机的体系,CPU本身,操作系统内核,系统平台,面向对象编程,程序的性能要有更深层次的把握。(机电出生的还真没学过部分课,如果要学的话感觉压力更大了。)
1.不了解数据结构和算法,就不会对程序的性能怎么优化,怎么从类库中选择合适的数据结构
2.不了解操作系统,就不了解这些开发工具的原理
3.不了解汇编,编译原理,就不知道程序运行时要多长时间多少内存,就不能编出高效的代码。
开始学习编程还是先学C和C++,系统api编程,他们更接近底层,学习他们就能搞清楚原理。
然后再多看一些经典书籍:算法导论,编程珠玑,代码大全,比较理论枯燥难懂。
第1章 快速上手
先说一下看的过程中自己的问题,本文在最前方摆放了一串代码,在自己不熟练的情况下,磕了太久以至于有点犯困,实际上在文章的后面对每一块细节都有注释,自己看书的方式显然也有问题。
一段C语言分为空白和注释、预处理指令(#inlcude、#define)、声明函数原型、main函数(程序执行的起点)。
如果有些声明需要用在不同的源文件里,可以在一个单独的文件中编写这些声明,这样之后使用只需要一份头文件声明的拷贝,避免了在维护这些代码时出现错误的可能性。
无返回值的函数称为过程,函数参数被声明const,这表示函数将不会修改函数调用者所传递的这两个参数。
在C语言中,数组参数是以引用的形式进行传递的,也就是传址调用,标量和常量是按值传递的。
C语言并不存在string数据类型,但字符串是一串以NUL字节结尾的字符,NUL作为字符串终止符,其本身不被看作是字符串的一部分。
“Hello”字符串常量,在内存中占据6个字节的空间,按顺序分别是H、e、l、l、o和NUL。
一个NUL字节指的是字节模式为全0的字节,类似”\0”这样的字节常量。
#if 0
statements;
#endif //注释多行代码更规范,防止注释的代码段内还有注释,引起错误
尝试scanf函数,&a,&b,&c前面的&是地址运算符,分别获得这三个变量的内存地址。所有标量前面都必须加上&,数组参数前面不需要。除了%c之外,所有输入值之前的空白(空格,制表符,换行符)都会被跳过,用%s输入字符串时,中间不能有空白。
int ch; ch作为整形,而事实上却用它来读取字符,是因为EOF是一个整型值,它的位数比字符类型要多,所以把ch声明为整型可以防止从输入读取的字符意外的被解释为EOF。字符只是小整数型而已,所以用一个整型变量容纳字符值并不会引起任何问题。
尝试puts函数,puts函数只能接收一个字符串作为参数,printf函数可以接收多个(Puts函数会将字符串输出到标准输出流(stdout)即显示器上,而printf函数可以定向输出到文件或其他设备)。尝试了putchar和getchar()函数,只读取输出一个字符。
简单函数之后做一个表格对比分析。
Printf可以格式化输出,puts只能输出字符串。
常用printf格式代码的几种格式符,无非是十进制转换成八进制,十进制还是十六进制的输出。但如果要把定义的数据类型为int的,转换为浮点值%g格式输出,会得到混乱的数据。
如果遇到特别长的输入行,可能没有办法防止gets函数溢出。这个漏洞是gets函数的缺陷,应该换用fgets函数。
如今软件开销的最大之处并非在于编写,而在于维护。所以需要书写正确的注释,并且在修改代码后注意注释的更新,注释如果不正确那还不如没有。
C语言始终都要检查,确保数组不越界。但C语言并不执行数组下标的有效检查,因为C语言的设计初衷是追求效率和灵活性。
在C语言中,数组是一块连续的内存区域,通过下标可以直接访问数组中的元素。由于C语言的设计目标是尽可能地接近底层硬件,因此在编译时并不会对数组下标进行有效性检查。
效率:C语言的设计初衷是高效地操作内存,对数组下标进行有效性检查会增加额外的运行时开销。在大规模的数据处理和性能敏感的应用中,这种开销是不可接受的
灵活性:C语言允许程序员直接操作内存,包括指针运算和数组越界访问。这种灵活性使得C语言可以更好地适应各种底层硬件和操作系统的特性,同时也给了程序员更多的责任和自由。
本日个人疑惑
1.汇编语言还需了解
2.目前我并不理解面向对象模型的C语言程序设计,是什么,如何设计
3..net,j2ee,php,sqlserver,css,ajax全都一概不知,不过我目前仅需要把C学好就够了
4.查阅ASCII 码表
5.编写一个空循环体
6.编译器
7.了解各个标准库函数功能
8.需要标准输入的,在vscode中调试如何实现
并非需要尽早自问自答,部分内容或在今后的学习中加深印象。希望个人拖延症别作祟。
心理状况
因为这是第二第三遍看本书了,看的速度也依然很慢,我不理解。
拖延症,无法集中,半途而废,心理压力,浮躁,静不下心,各种debuff,看到其他人能适应解决开发过程中的各种问题,我连编辑软件的英文界面和文本都还不适应,多少是会焦虑的。
心里已经在想着这是最后一次学代码了,我毕竟也不是科班出身,实在干不了这行早点放弃也最好不过。
简单的代码也基本不是自己写的,非常惫懒,copy调试一下就完事了。
但一切又没有办法,我自己能力不行,想走捷径的话以后也会吃亏,要心平气和地慢慢来。
坚持,可以解决很多问题,只是见效实在太晚了。
昨天还看到AI音乐模型上知乎热点了,每次AI爆点都有种时不我待的感觉,世界看起来就特别两极分化,自己也是,一边想着摆烂不干了回家种田能活着就不错,另一边想着再努力卷一卷,趁着还没30岁找机会吃一波时代红利。
然后再讲讲自己的专注,对于我个人来说,因为真的很缺时间,但是是因为自己的坏习惯导致的。
1.热衷于收发消息,水群聊天,投机倒把(黄金,股市,热点新闻)
2.不想干活的时候就刷刷小视频
3.听音乐
4.经常地撰写规划而很难全部执行完毕
5.白日梦,幻想,脑内编故事
自己的专注必须要剔除这些东西,把手机放远,尽可能断网,手头有什么事情就先把手头的处理完了,总是拖延当DDL战士,生活就一直显得很匆忙了,精力就在不自觉间逃逸掉了。
最后再说说隔了一天没看发现有四个点赞一个收藏,本来觉得没人看也挺好的,反正就是自己的树洞,有人看还是有点小兴奋还是小紧张?虽然哪怕可能是机器人或者顺手点的?我也不知道平台是怎么推送的。总之谢谢。
其实这份也是存稿,这两天根本没怎么看,现阶段我尽快学习突破,无论花多少时间或许都是值得的(为什么语气不再肯定一点呢?)
英语
integrate整体的,一体化的 terminal终端 integrate terminal集成终端 column专栏,栏目
2024.3.27发布