注释:注释以符号/*开始,以符号*/结束。在C程序中,凡是可以插入空白的地方都可以插入注释。然后,注释不能嵌套,也就是说,第一个/*符号和在第一个*/之间的内容都被看作是注释,不管里面右多少给/*符号。
在有些语言中,注释有时用于把一段代码“注释掉”,也就是这段代码在程序中不起作用,但并不将其真正从源文件中删除。在C中,要从逻辑上删除一段C代码,更好的办法是使用#if指令。如下列所示
#if()
Statements
#endif
在#if和#endif之间的程序段就可以有效地从程序中删除,即使这段代码之间原先存在注释亦无妨,所以这是一种更为安全的方法。
预处理指令(preprocessor directives):它们是由预处理(preprocessor)解释的。预处理读入源代码,根据预处理指令对其进行修改,然后把修改过的源代码交给编译器。
1)stdio.h头文件使我们可以访问标准I/O库(Standard I/O)中的函数,这组函数用于执行输入和输出。stdlib.h定义了EXIT_SUCCESS和EXIT_FAILURE符号。string.h头文件提供了函数来操作字符串。
2)如果有一些声明需要用于几个不同的源文件,这个技巧也是一种方便的方法——在一个单独的文件中编写这些声明,然后指令用#include指令把这个文件包含到需要使用这些声明的源文件中。这样,就只需要这些声明的一份拷贝,用不着在许多不同的地方进行复制,避免了在维护这些代码时出现错误的可能性。
3)另一种预处理指令是#define,它把名字MAX_COLS定义为20,把名字MAX_INPUT定义为 1000。当这个名字以后出现在源文件的任何地方时,它就会被替换为定义的值。由于它们被定义为 字面值常量,所以这些名字不能出现于有些普通变量可以出现的场合(比如赋值符的左边)。这些 名字一般都大写,用于提醒它们并非普通的变量。
这些声明被称为函数原型(function prototype)。它们告诉编译器这些以后将在源文件中定义的函数的特征。这样,当这些函数被调用时,编译器就能对它们进行准确性检查。每个原型以一个类型名开头,表示函数返回值的类型。跟在返回类型名后面的是函数的名字,再后面是函数期望接受的 参数。所以,函数read_column__numbers返回一个整数,接受两个类型分别是整型数组和整型标量的参数。函数原型中参数的名字并非必需,这里给出参数名的目的是提示它们的作用。
指针指定一个存储于计算机内存中的值的地址,类似于门牌号码指定某个特定的家庭位于街道的何处
参数被声明为const,这表示函数将不会修改函数调用者所传递的这两个参数。关键字void表示函数并不返回任何值,在其他语言里,这种无返回值的函数被称为过程(procedure)。
每个C程序都必须有一个main函数,因为它是程序执行的起点。main函数的函数体包括左花括号和与之相匹配的右花括号之间的任何内容。
在C语言中,数组参数是以引用(reference)形式进行传递的,也就是传址调用,而标量和常量则是按值(value)传递的(分别类似于Pascal和Modula中的var参数和值参数)。 在函数中对标量参数的任何修改都会在函数返回时丢失,因此,被调用函数无法修改调用函数以传值形式传递给它的参数。然而,当被调用函数修改数组参数的其中一个元素时,调用函数所传递的数组就会被实际地修改。事实上,关于C函数的参数传递规则可以表述如下:
所有传递给函数的参数都是按值传递的。但是,当数组名作为参数时就会产生按引用传递的效果。
gets函数从标准输入读取一行文本并把它存储于作为参数传递给它的数组中。一行输入由一串字符组成,以一个换行符(newline)结尾。gets函数丢弃换行符,并在该行的末尾存储一个NULL字节 (一个NUL字节是指字节模式为全0的字节,类似’\0’这样的字符常量)。然后,gets函数返回一个非NULL 值,表示该行已被成功读取。当gets函数被调用但事实上不存在输入行时,它就返回NULL值,表示它到达了输入的末尾(文件尾)。
C语言中存在一项规定:字符串是一串以NULL字节结尾的字符。NULL是作为字符串终止符,它本身并不被看作是字符串的一部分。字符串常量(string literal)就是源程序中被双引号括起来的一串字符。
printf函数执行格式化的输出。printf函数接受多个参数,其中第一个参数是一个字符串,描述输出的格式,剩余的参数就是需要打印的值。格式常常以字符串常量的形式出现。
1)NULL是ASCII字符串中‘\0’字符的名字,它的字节模式是全0。NULL指一个其值为0的指针。它们都是整型值,其值也相同,所以它们可以互相使用。然而,应该还是使用适当的常量,因为它能告诉阅读程序的人不仅使用0这个值,而且告诉她使用这个值的目的。
2)符号NULL在头文件stdio.h中定义。另一方面,并不存在预定的符号NULL,所以如果要使用它而不是字符常量’\0’,必须自行定义。
scanf函数的返回值是函数成功转换并储存于参数中值的个数。
&&是“逻辑与”操作符。要使整个表达式为真,&&操作符两边的表达式都必须为真。
1)使用&&操作符时,千万不要误用了&操作符。&操作符执行“按位与”的操作。虽然有时候它的操作结果和&&操作符相同,但很多情况下都不一样。
“循坏终止”这句话的意思时循环结束而不是它突然出现了毛病。
%操作符执行整数的除法,但它给出的结果时除法的余数而不是商。
puts函数是gets函数输出版本,它把指定的字符串写到标准输出并在末尾添加上一个换行符。
exit函数,终止程序的运行,EXIT_FALURE这个值被返回给操作系统,提示出现了错误。
EOF是整型值,它的位数比字符类型要多。
While语句之后的单独一个分号称为空语句。
当数组名作为实参时,传给函数的实际上是一个指向数组起始位置的指针,也就是数组在内存中的地址。正因为实际传递的是一个指针而不是一份数组的拷贝,才使数组名作为参数时具备了传址调用的语义。
for语句包含了3个表达式(顺便说一下,这3个表达式都是可选的)。第一个表达式是初始部分,它只在循环开始前执行一次,第二个表达式是测试部分,它在循环每次执行一次后都要执行一次。第三个表达式是调整部分,它在每次循环执行完毕后都要执行一次,但它在测试部分之前执行。