Expert C Programing—阅读笔记一

第一章 C:穿越时空的迷雾

1)在宏的扩展中,空格会对扩展的结果造成很大的影响。

#define a(y)  a_expanded(y)

a(x);

被扩展为:a_expanded(x);

#define a (y)  a_expanded(y)

a(x);

则被扩展为:(y)  a_expanded(y)(x)

观点:对于宏这样的预处理器,只应该适量使用。

2const最有用之处就是用它来限定函数的形参,这样该函数将不会修改实参指针所指的数据。

3sizeof相关,比较语句:

#define TOTAL_ELEMENTS  (sizeof(array) / sizeof(array[0]))

#define TOTAL_ELEMENTS  (sizeof(array) / sizeof(int))

应使用前者,因为可以在不修改#define语句的情况下改变数组的基本类型(比如,把int变成char)。

4register简化了编译器,却把包袱丢给了程序员。

5)强类型/弱类型:

强类型语言表示变量的类型不可随意转换;而弱类型语言,变量的类型可以随需要任意转换,而且通常都是隐式的。

 

第二章这不是Bug,而是语言特性

1)一个‘L’NUL用于结束一个ASCII字符串;两个‘L’NULL用于表示什么也不指向(空指针)。

2ANSI C新特性:相邻的字符串常量将被自动合并成一个字符串,除了最后一个字符串外,其余每个字符串末尾的‘\0’字符会被自动删除。旧风格是在行末加‘\’

旧风格:

printf("Afavorite children's book \

is'muffy Gets it: the hilarious tale of a cat, \

aboy, and his machine gun'");

新风格:

printf("Afavorite children's book"

"is'muffy Gets it: the hilarious tale of a cat," 

"aboy, and his machine gun'");

然而,这种自动合并意味着字符串数组在初始化时,如果不小心漏掉了一个逗号,编译器将不会发出错误信息,而是悄无声息地把两个字符串合并在一起。

3)当sizeof的操作数是个类型名时,两边必须加上括号(这常常使人误以为它是个函数),但操作数如果是变量则不必须加括号。

4)代码i = 1,2; —>实际执行情况:i赋值为1,接着执行常量2的运算,计算结果丢弃。最终,i的结果是1而不是2(逗号运算符在所有运算符中优先级最低)

5)结合性:所有的赋值符(包括复合赋值符)都具有右结合性。

6fgets()彻底取代gets()

7ANSI C规定了“maximal munch strategy(最大一口策略)”,表示如果一个标记有超过一种的解释方案,编译器将选取能组成最长字符序列的方案。如z = y+++x;被解析为z = y++ + x;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值