CALLBACK宏的误解
CALLBACK宏从字面看起来是“回调”的意思,似乎只要是回调函数就应该有此修饰。其实回调函数并不一定有此修饰。这个修饰的意思是被修饰函数采用__stdcall调用约定,出现这个宏的原因是:微软中大部分回调函数都采用stdcall调用约定(大概是为了适应除了C语言编程之外的其他编程语言吧),而对于用户设计的回调函数,是否有必要采用stdcall调用约定完全依照使用者的习惯和设计上下文。
进制
在刚开始学习计算机原理时,大家接触了数的进制问题。一些人以为内存中数也有二进制、8进制和16进制之分。其实对于计算机而言,他只能利用一些电子开关来保存数字(甚至所有东西都是电子开关保存的),这些电子开关只有开和关两种状态,多个电子开关构成一组(一般每组电子开关的个数都是8的倍数),表示一个数。那么在计算机内部要说一定有进制,就只有一种2进制。实际上,进制只是人类在书面表示数和计算的一种方式,计算机采用的是逻辑电路实现的,其原理完全不同,因此只有给人看(格式化输出和格式化输入)时才存在数制,而计算机内部是没有进制的区别的,16进制的12和10进制的18以及8进制的22对于计算机而言都是一样的,就是8个电子开关分别处于关关开关关关开关状态。
文本文件和二进制文件的误解
看到文本文件和二进制文件,很多人都以为他们在存储格式、内容上都是截然不同的。有人认为文本文件就是用notepad打开就可以看的文本,而二进制文件则是不可读的;还有人认为二进制文件就是以二进制格式存储的文件,这又和数和数的表示挂钩了。
首先从存储格式上,二者没有什么不同,二进制文件和文本文件都是以一种平铺的字节数组的方式存放数据,其中和数的进制中的二进制甚至完全没有关系。
其次从内容上,一般文本文件比较特殊,是可阅读的,但是从理论上而言,文本文件可以是二进制文件的一个特例,也就是特殊的二进制文件也是可读的。
那么文本文件和二进制文件到底有何区别哪?其实很简单,他们只有在文件读写时有些差别。当往文件中写数据时,对于文本方式打开的文件,系统会自动的把连续的0A字符改成0D0A两个字符,对于二进制方式打开的文件则不进行转换。读的时候相反,对于文本文件,自动把0D0A转换为0A,对于二进制文件则不转换。
\和\\的误解
字符是计算机程序设计中常见的数据类型,计算机本身并不认识什么是字符,字符是编程的人对他的理解,也是计算机编程语言的一种语义。计算机用一系列数字表示字符,例如字符'0'在计算机中就是用数字48来表示的。
在输入编程代码时,大部分字符都是可以直接用键盘输入的,但是一些特殊的被称为“不可见”字符的字符则无法输入。例如表示换行的字符就无法用键盘输入,在代码中也无法直接用一个简单的字符来表示它。为此,程序设计语言提供一种转义字符的机制,把一些不可见字符用可见字符的序列表示。在C语言中,转义字符就是反斜杠。
对于不可见字符,C语言提供了两种转义方式,一种是数字转义法,也就是反斜杠后面紧跟一组数字,紧跟的数字就是计算机内部表示那个不可见字符的值。例如换行符在计算机内存中表示为数字10,那么在C语言中就可以用\xA或者\012表示(注意,只能用16进制或者8进制,16进制有x前缀,8进制则用0前缀)。另外一种是在反斜杠后面紧跟一个特殊的字符来表示,下面就是这些转义序列的含义:
| 转义序列 |
代表字符 |
计算机内部值 |
| \a |
振铃(Bell) |
7 |
| \b |
退格(BACKSPACE) |
8 |
| \f |
走纸(FormFeed) |
12 |
| \n |
换行(NewLine) |
10 |
| \r |
回车(Carriage return) |
13 |
| \t |
水平制表符(TAB) |
9 |
| \v |
垂直制表符 |
11 |
| \' |
单引号 |
39 |
| \“ |
双引号 |
34 |
| \\ |
反斜杠 |
92 |
| \? |
同问号 |
63 |
| \a |
振铃(Bell) |
7 |
?
这里有几个特别的转义字符,一个是\?,明明这是个可输入字符,偏要弄个转义,不知道为什么。还有\\,由于单个反斜杠已经表示转义字符序列开始了,为了表示反斜杠本身,不得不用两个来表示。还有一个,在C语言编码时,如果行末是一个\,也是一个转义,表示续行。除了上面列出的,其他所有以反斜杠开头的字符,都会出现一个编译时告警。
最近观察,初学者容易犯错的是把这个转义字符序列当成是运行时的东西了。要知道,这个转义只在编写代码时有效,在运行时、内存中和文件内都不存在转义字符。因此在表示目录时:在运行时只有“C:\windows”,不需要“C:\\windows”,而在编码时则必须用“C:\\windows”,不能用“C:\windows”。同样,也不存在把“C:\windows”转换为“C:\\windows”的问题,如果有人问怎么转换,一般都是理解错误。