C语言细节与技巧
作为当前最流行的编程语言,C语言应该是每一个程序员必备的技能。不过,C语言里面有许多容易忽略或者误解的细节,当然也有许多技巧,在此我做了一个总结,希望能对各位同仁有所帮助!
1.boolean类型
众所周知,C语言没有boolean类型,不过可以很轻松地通过typedef和enum自定义。
typedef enum { false=0, FALSE=0, true=1, TRUE=1 } bool;
2.enum技巧
enum其实就是把一个标识符对应到一个常数,枚举值默认从0开始,比如
enum { ZERO, ONE, TWO, OTHER }; // ZERO=0, ONE=1; TWO=2, OTHER=3
可以任意改变枚举对应的值,比如
enum { A=65, B, C, E=69, F, AA=65, BB }; // A=65, B=66, C=67, E=69, F=70, AA=65, BB=66
3.函数名和函数指针以及函数指针参数
在C语言里面,函数名其实就是指针,下面两种函数调用方式都是正确的,这是为了方便程序编写,编译器对代码做了优化,所以可以不用在函数名前面加上‘*’。
void say(const char *str) { printf("%s\n", str); } // 函数调用 say("hello world!"); (*say)("hello world!");
而对函数指针和函数指针参数而言,情况也是类似的。
void (*func_ptr)(const char *) = say; // 或者void (*func_ptr)(char *) = &say; func_ptr("hello world!"); // 或者(*func_ptr)("hello world!"); void my_func(void (*executed_func)(const char *), const char *str) { executed_func("hello world!"); // 或者(*executed_func)("hello world!"); }
4.int char转换
字符串转换数字,atoi, atol, atof分别对应int型,long型,double型。数字转换字符串要用到sprintf函数(stdio.h文件已包含)。
// 字符串转换为int char s[] = "4321"; int a = atoi(s); // int转换为字符串 int x = 1234; char str[12]; sprintf(str, "%d", x);
5.变量初始化
全局变量程序会自动初始化为0或者null,局部变量(静态局部变量除外)必须手动初始化,否则将会得到一些随机的数。数组初始化的时候应该注意,除了手动赋值之外其它的所有变量均初始化为0或者null。
// 以下情况为局部变量 int a[] = {1, 2, 3, 4}; // 长度固定可以省略 int b[12] = {1, 2}; // b[0]=1, b[1]=2, 其它均为0 char c[12] = "hi"; // c[0]='h', c[1]='i', 其它均为‘\0’ int *ptr[12] = {}; // 全部为null
6.whitespace对输入输出的影响
scanf函数输入字符可以接受所有的空字符(空格,制表符,回车),为了避免这种情况,可以在输入格式控制里面添加一个空格,这样就会忽略所有的空字符,知道读到下一个非空字符才输入。
int n; char c; scanf("%d%c", &n, &c); // 但输入为12 h的时候,n=12, c=' ' scanf("%d %c", &n, &c); // 但输入为12 h的时候,n=12, c='h' scanf("%d %c", &n, &c); // 但输入为12回车h的时候,n=12, c='h'
scanf函数输入字符串的时候不能接受空字符(空格,制表符,回车),即遇到这些字符的时候就会终止字符串的输入,但输入的字符串不为空(即!=""),如果字符串中要输入空格或者制表符,可以用gets函数,遇到回车即终止字符串的输入,即使当前字符串为空。
// 假设键盘输入为hello world! I love this world!之后回车 char str1[100]; char str2[100]; scanf("%s", str1); // str1="hello" gets(str2); // str2=" world! I love this world!"
另外,字符、字符串的输入输出也可以用getchar,putchar,gets,puts函数,getchar函数可以接受空字符,puts函数默认换行。
char c; char str[100]; c = getchar(); putchar(c); gets(str); puts(str);
补充一点小知识:%p是专门输出地址的,%o和%x都是以unsigned int类型解析,%.2s只输出字符串前2位,函数参数是自右往左解析的,即int n=1; printf("%d%d%d", n, n++, n++);结果是321。
7.一些容易混淆的C与C++特性
C跟C++实在太像了,以致有时候把它们混为一谈,下面是一些最容易在C语言里面误用的C++特性:
1)C函数参数不能赋默认值
2)C函数参数不能传别名即&的方式
3)C没有bool和string类型
4)C在for循环的括号里面不能声明变量
5)C声明一个struct类型之后,在使用的时候还必须在类型名前面加上struct关键字
相关推荐
综上所述,掌握51单片机C语言的编程技巧,不仅是对技术细节的理解和运用,更是在实践中不断优化代码结构,提升程序性能的过程。无论是新手还是经验丰富的开发者,都能从这些核心知识点中获益,推动项目向更高水平...
通过学习,读者不仅可以掌握C语言的规范,还能理解其背后的实现细节,从而更好地编写高效、可靠的C代码。同时,书中对标准和实现的深度剖析也能提高读者的问题解决能力和代码调试技巧,使其在面对实际编程挑战时更加...
《C语言接口与实现》是一...总结来说,《C语言接口与实现》涵盖了C语言编程中接口设计的原则、实现的技巧以及相关的编程实践。通过对这些内容的深入理解和应用,开发者能够编写出更加高效、易于理解和维护的C语言程序。
**数据结构与算法**:C语言是数据结构和算法实现的理想选择,书中的实例将涵盖各种常用数据结构(如链表、树、图)和算法(如排序、搜索),并展示如何通过接口封装这些复杂逻辑,使得外部调用者只需关注功能,而...
10. **测试与调试**:在C语言编程中,单元测试和调试技巧是必不可少的。学会使用GDB等调试工具,以及编写自测代码,可以帮助找出并修复程序中的错误。 以上知识点都是《C语言接口与实现》可能会涵盖的主题,学习和...
《C语言接口与实现-创建可重用软件的技术》是一本深入探讨如何通过C语言构建高效、可维护、可重用软件的专业书籍。书中详细阐述了接口设计的重要性以及实现技术,旨在帮助开发者提升代码的质量和复用性。 首先,...
《C语言接口与实现:创建可重用软件的技术》是计算机编程领域的一本重要著作,由David R. Hanson撰写,张昆翻译,并由机械...通过阅读和学习本书,读者将能够更深入地理解C语言编程,并掌握创建可重用API的关键技巧。
国家二级C语言改错题技巧总结 在国家二级C语言考试中,改错题占据了重要的地位。只有掌握了改错题的技巧,才能在考试中取得优异的成绩。下面将对改错题的技巧进行总结。 一、改错题之方法步骤 在做改错题时,首先...
C语言的单词结构和特有标识虽然与其他高级编程语言有所不同,但其基本算法和逻辑运行方式却是相通的。掌握C语言的基础知识,如结构体、指针、数组等,对于编程技术的提升至关重要。 “熟能生巧”是提升C语言编程...
在深入探讨C语言编程细节之前,我们需澄清一点:标题与描述中提及的主题为C语言,而部分内容中却转向了C++。尽管两者都属于C系语言家族,但它们之间存在显著差异,尤其是在语法、标准库以及面向对象编程的支持上。...
以上只是"编程技巧实例"可能涵盖的部分主题,实际资源中可能还包括更多细节和具体示例,如递归函数的实现、内存管理的最佳实践、错误处理的策略等。通过深入学习和实践这些知识点,你将能够更好地驾驭C语言,提升...
2. **《C专家编程》**(Expert C Programming: Deep C Secrets):作者Peter van der Linden在这本书中深入探讨了C语言的高级特性和一些鲜为人知的细节。这本书适合已经有一定C语言基础的读者,它揭示了C语言的一些...
相比汇编语言,C语言提供了更高的抽象层次,使开发者能更专注于解决问题而不是底层细节。在8051上使用C语言,需要注意以下几点: 1. I/O操作:C语言中的数据类型和函数可以用来访问和控制8051的端口。例如,`#...
根据提供的信息,我们可以了解到这本书《C语言程序设计学习指导与实验教程(第2版)》由冯相忠、高禹主编,主要分为两个部分:C语言学习指导与C语言实验教程。下面将针对这两个部分进行详细的知识点解析。 ### ...
此外,书中还将涵盖C语言与MATLAB数据类型转换的细节。MATLAB中的数组、矩阵等数据类型在C语言中可能有不同的表示方式,因此理解这些转换规则对于正确传递数据至关重要。例如,MATLAB的复数类型在C语言中需要使用...