读书笔记之《C语言深度剖析》第一章:关键字

本文是《C语言深度剖析》第一章的读书笔记,详细介绍了C语言的关键字,包括auto、register、static、short、int、long等基本数据类型,以及sizeof、if、else、switch、case、do、while、for等控制结构的关键字,强调了它们的作用、使用场景和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一章引言

什么是定义及声明?

定义:定义是编译器创建一个对象,并且为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。

声明:1.告诉编译器该变量名已经匹配了一个内存上。2.告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量

定义声明最重要的区别:定义创建了对象并为这个对象分配了内存,声明没有分配内存


1.1 最宽恒大量的关键字----auto

编译器在默认的缺省情况下,所有变量都是 auto 的。读者可以当作不存在该关键字。


1.2 最快的关键字---- register

这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内存寻址访问以提高效率。

1.2.1,皇帝身边的小太监----寄存器

寄存器其实就是一块一块小的存储空间,只不过其存取速度要比硬盘和内存快得多。(价格也贵很多)

数据从内存里拿出来先放到寄存器,然后 CPU 再从寄存器里读取数据来处理,处理完后同样把数据通过寄存器存放到内存里。

1.2.2,使用 register 修饰符的注意点

虽然寄存器的速度非常快,但是使用 register 修饰符也有些限制的:register 变量必须是能被 CPU 寄存器所接受的类型。意味着 register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度。 而且 register 变量可能不存放在内存中,所以不能用取址运算符“&”来获取 register 变量的地址。


1.3,最名不符实的关键字----static

不要误以为关键字 static 很安静,其实它一点也不安静。这个关键字在 C 语言里主要有两个作用,C++对它进行了扩展。

1.3.1,修饰变

第一个作用:修饰变量。静态变量又分为局部静态和全局静态变量,它们都存在内存的静态区。

静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用 extern 声明也没法使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。想要使用就得在前面再加 extern ***。

静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他函数也用不了。由于被 static 修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。

1.3.2,修饰函数

第二个作用:修饰函数。函数前加 static 使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。不用担心自己定义的函数,是否会与其它文件中的函数同名。


1.4,基本数据类型----short、int、long、char、float、double

1.4.1,数据类型与“模子”

六种数据类型的字节大小

1.4.2,变量的命名规则

在《高质量的C-C++编程》的笔记部分已记录

(标识符的命名规则暂未阅读)


1.5,最冤枉的关键字----sizeof

1.5.1,常年被人误认为函数

sizeof是关键字。

sizeof 在计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略。且一般情下,sizeo 是在编译时求值,所以 sizeof(i++)不会引起副作用。但由于sizeof(i++)与 sizof(i)的结果一样,所以没有必要且不允许写这样的代码。同样,“sizeof(i=1234);”这样的代码也不允许,因为i的值仍为0,并没有被赋值为1234。sizeof 操作符里面不要有其他运算,否则不会达到预期的目的。

在 C99标准 中,计算柔性数组所占空间大小时,sizeof 是在运行时求值,此为特例。

1.5.2,sizeof(int)*p 表示什么意思?

几个关于指针内存大小的问题-数组


1.6,signed、unsigned 关键字

基本数据类型的最高位腾出来,用来存符号,同时约定如下:最高位如果是 1,表明这个数是负数,其值为除最高位以外的剩余位的值添上这个“-”号;如果最高位是 0,表明这个数是正数,其值为除最高位以外的剩余位的值。

这样的话,一个 32 位的 signed int 类型整数其值表示法范围为:- 231~ 231 -1;8 位的char 类型数其值表示的范围为- 27 ~ 27 -1。一个 32 位的 unsigned int 类型整数其值表示法范围为:0~ 232 -1;8 位的 char 类型数其值表示的范围为 0~ 28-1。同样我们的 signed 关键字也很宽恒大量,你也可以完全当它不存在,编译器缺省默认情况下数据为 signed 类型的。


int main()
{
    signed char a[1000];
    int i;
    for(i=0; i<1000; i++)
    {
        a[i] = -1-i;
    }
    printf("%d\n",strlen(a));
    return 0;
}

这个题的答案是255(原因:a[0]~a[254]里面的值都不为 0,而 a[255]的值为 0。strlen 函数是计算字符串长度的,并不包含字符串最后的\0。判断一个字符串是否结束的标志就是看是否遇到\0;如果遇到\0.则认为本字符串结束)


[规则 1-18]单纯的 char 类型应该只用于字符值的存储和使用有符号和无符号的“char”型变量只能用于数值的存储和使用。

[规则 1-19]所有无符号型常量都应该带有字母 U后缀


1.7,if、else 组合(在《高质量的C-C++编程》的笔记部分已记录)

1.7.1,bool 变量与“零值”进行比较
1.7.2, float 变量与“零值”进行比较
1.7.3,指针变量与“零值”进行比较
1.7.4,else 到底与哪个 if 配对呢?
1.7.5,if 语句后面的分号
1.7.6,使用 if 语句的其他注意事项

1.8,switch、case 组合

1.8.1,不要拿青龙偃月刀去削苹果

[规则1-26]每个 case 语的结尾绝对不要忘了加 break,否则将导致多个分支重叠(除非有意使多个分支重叠)。

[规则1-27]最后必须使用 default 分支。即使序真的不需要 default 处理,也应该保留语句。这样做并非画蛇添足,可以避免让人误以为你忘了 default 处理

[规则1-28]在switch case 组合中,禁止使用 return 语句。

[规则1-29]switch 表达式不应是有效的布尔值。

1.8.2,case 关键字后面的值有什么要求吗?

case 后面只能是整型或字符型的常量或常量表达式

1.8.3,case 语句的排列顺序

[规则1-30]按字母或数字顺序排列各条 case 语句。

[规则 1-31]把正常情况放在前面,而把异常情况放在后面。

[规则 1-32]按执行频率排列 case 语句。

1.8.4,使用 case 语句的其他注意事项

[规则1-33]简化每种情况对应的操作。

[规则 1-34]不要为了使用 case 语而刻意制造一个变量。

[规则1-35]将 default 子句只用于检查真正的默认情况。


1.9,do、while、for 关键字(在《高质量的C-C++编程》的笔记部分已记录)

1.9.1,break 与 continue 的区别
1.9.2,循环语句的注意点

1.10,goto 关键字(在《高质量的C-C++编程》的笔记部分已记录)


1.11,void 关键字(中途断网编写的内容丢失,也没人会看我的笔记,我就不补了,有需要我再补)


1.12,return 关键字

[规则1-48]return 语句不可返回指向“内存”的“指针”因为该内存在函数体结束时被自动销毁


1.13,const 关键字也许该被替换为 readolny(下次阅读)

1.13.1 const修饰的只读变量
1.13.2,节省空间,避免不必要的内存分配,同时提高效率

1.14,最易变的关键字----volatile


1.15,最会带帽子的关键字----extern


1.16,struct 关键字

1.15.1,空结构体多大?
1.15.2,柔性数组
1.15.3,struct 与 class 的区别

1.16,union 关键字

1.16.1,大小端模式对 union 类型数据的影响
1.16.2,如何用程序确认当前系统的存储模式?

1.17,enum 关键字

1.17.1, 枚举类型的使用方法

1.17.2,枚举与#define 宏的区别


1.18,伟大的缝纫师----typedef 关键字

1.18.1,关于马甲的笑话

1.18.2,历史的误会----也许应该是 typerename

1.18.3,typedef 与#define 的区别

1.18.4,#define a int[10]与 typedef int a[10];


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值