1.为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局(American National Standard Institution)为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言的标准。1980年代至今的有关程序开发工具,一般都支持符合ANSI C的语法。
2.编译器,是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。源代码一般为高阶语言 (High-level language), 如 Pascal、C、C++、C# 、Java 等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。 一个现代编译器的主要工作流程如下: 源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)
3.链接器(Linker)是一个程序,将一个或多个由编译器或汇编器生成的目标文件外加库链接为一个可执行文件。目标文件是包括机器码和链接器可用信息的程序模块。简单的讲,链接器的工作就是解析未定义的符号引用,将目标文件中的占位符替换为符号的地址。链接器还要完成程序中各目标文件的地址空间的组织,这可能设计重定位工作。
4.Java不同于一般的编译运行计算机语言和解释执行计算机语言。它首先将源代码编译成字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。
5.机器语言(machine language)是一種指令集的體系。这种指令集,称機器碼(machine code),是電腦的CPU可直接解讀的資料。机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能。机器语言具有灵活、直接执行和速度快等特点。不同型号的计算机其机器语言是不相通的,按着一种计算机的机器指令编制的程序,不能在另一种计算机上执行。
6.在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏(macro)"进行处理. 一般的C编译器都将预处理, 编译, 汇编, 连接过程集成到一起了.预处理命令由#(hash字符)开头, 它独占一行, 语句中可以利用"/"来换行.#之前只能是空白符.常用的预处理命令如下:
#define 定义一个预处理宏
#undef 取消宏的定义
#include 包含文件命令
#if 编译预处理中的条件命令, 相当于C语法中的if语句
#ifdef 判断某个宏是否被定义, 若已定义, 执行随后的语句
#ifndef 判断某个宏是否未被定义
7.带参数的宏也被称为"函数宏". 利用宏可以提高代码的运行效率: 子程序的调用需要压栈出栈, 这一过程如果过于频繁会耗费掉大量的CPU运算资源. 所以一些代码量小但运行频繁的代码如果采用带参数宏来实现会提高代码的运行效率.
8.C语言中,程序从main开始执行。main函数通过调用和控制其他函数进行工作。
9.Hello World 程序
#include <stdio.h>
int main(void)
{
printf("Hello, world!/n");
return 0;
}
10.通过指针(pointer),C语言可以容易的对存储器进行低级控制。
如果一个变量声明时在前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 * 则是取内容操作符,意思是取这个内存地址里存储的内容。
例如:
int *pi; /* 指向整型数据的指针变量 */
int *api[3];/* 由指向整型数据的指针构成的数组,长度为 3 */
char **argv; /* 指向一个字符指针的指针 */
储存在指针中的地址所指向的数值在程序中可以由 * 读取。例如,在第一个例子中, *pi 是一个整型数据。这叫做引用一个指针。
另一个运算符 &,叫做取地址运算符,它将返回一个变量、数组或函数的存储地址。因此,下面的例子:
int i, *pi; /* int and pointer to int */
pi = &i;
i 和 *pi 在程序中可以相互交替使用,直到 pi 被改变成指向另一个变量的地址。
11.C语言使用栈来保存函数返回地址/栈祯基址、完成函数的参数传递和函数局部变量的存储。 如果程序需要在运行的过程中动态分配内存,可以利用堆来实现。
C程序的元素存储在内存的时候有3种分配策略:
静态分配:全局变量或者静态变量的存储将使用静态分配方式。静态分配的内存一般会被编译器放在数据段或代码段来存储,这样,在编译时就必须确定变量的大小。全局及静态变量放在数据段的低端;全局及静态常量放在代码段的高端。
自动分配:函数的自动局部变量应该随着函数的返回会自动释放(失效),利用栈来满足.C函数永远不应该返回一个局部变量的地址。
动态分配:变量的大小在运行时有可能改变,使用堆来满足要求。ANSI C 定义的堆操作函数是malloc(3)、calloc(3)、realloc(3)和free(3)。
12.c语言不负责内存边界检查。
13.C语言的标准文文件要求了一个平台移植C语言的时候至少要实现的一些功能和封装的集合,称为“标准库”,标准库的声明头部通过预处理器命令#include进行引用。
14.C语言规定使用一个变量或调用一个函数前必须声明,为了使用方便,经常把常用函数,例如Windows API的函数,MFC类写入头文件.h,这样每次需要引用时只要使用#include加入就可以了。
15..c文件就是C语言源程序,.cpp是C++语言源程序。严格地说,.cpp是按照C++语法编译,而.c是按照C语法编译,略有不同。C++与C语言兼容,所以将C语言源程序写入.cpp文件也是可以的。
16.VC++一般使用MFC类库进行编程,在这种情况下WinMain已经被封装在MFC类库中了(在appmodul.cpp中),编程时看不到。对于MFC程序,一般初始化工作不是在WinMain中做,而是在CWinApp:InitInstance中做。