"《你必须知道的495个C语言问题》是关于C语言编程的一本问答集,由Steve Summit原著,朱群英和孙云翻译。这本书旨在解决C语言编程中的常见问题,涵盖了声明与初始化、结构、联合和枚举等多个主题。"
在C语言中,选择整数类型(如int、short、long和无符号类型)取决于具体需求。如果你需要处理的数值范围超过32,767或低于-32,767,应该使用long型。如果内存空间有限,例如需要创建大量数组或结构体,可以考虑使用short型。通常情况下,int型是默认的选择。无符号类型适用于需要避免符号扩展且溢出行为重要的情况,但要注意混合使用有符号和无符号类型可能导致的问题。
1. 全局变量和函数的声明应尽可能清晰,使用extern关键字表示外部定义的变量或函数。在函数声明中,extern表示变量或函数是在其他地方定义的。
2. auto关键字在C语言中主要用于局部变量,表明变量的作用域仅限于当前块,但在现代C语言中,它的使用并不常见,因为这是默认的行为。
3. 链表的typedef和结构体定义需要注意语法,结构体可以包含指向自身的指针,但需要正确处理指针类型。
4. 复杂声明的理解可以通过从右向左读取的方式来帮助解析,例如,一个函数指针数组的声明需要正确地理解类型嵌套。
5. main()函数的正确定义通常是int main(void),void main()不标准,可能会导致问题。
6. 未初始化的变量的值是不确定的,不应依赖其初始值。全局变量可能被初始化为零,但不能假定为NULL指针或浮点零。
7. 字符串字面量不能直接赋值给未初始化的数组,需要使用动态分配,如char *p = malloc(11);。字符串字面量常量是只读的,不能直接修改。
8. char a[]="stringliteral"是在编译时赋值,而char *p="stringliteral"是指向只读内存的指针,尝试修改p[i]会导致程序崩溃。
9. 函数指针的声明和初始化需要匹配正确的返回类型和参数列表,例如int (*func_ptr)(int, int) = some_func;。
在结构、联合和枚举部分:
1. struct x1{};是结构体声明,定义了一个结构体类型,而typedef struct {} x2;是为结构体创建一个别名。两者不同在于前者不能直接使用,需要struct关键字,后者可以直接用x2。
2. struct x{}; x the_struct;是错误的,因为结构体名称x在这里被视为类型名,而不是变量名。
3. 结构体可以包含指向自身的指针,这在实现递归结构或自引用数据类型时很有用。
4. 实现抽象数据类型(ADT)通常通过结构体和指针结合,以及提供一组操作这些类型的函数来完成。
5. C语言不支持直接的面向对象编程特性,如继承,但可以通过结构体嵌套、函数指针等方式模拟类似的功能。
该书通过一系列问题解答,深入浅出地介绍了C语言编程中的关键概念和技术,对初学者和有经验的开发者都有很高的参考价值。