作者在 2011-04-04 22:52:53 发布以下内容
当常数0被转换成指针使用,这个指针绝对不能被解除引用,即当我们将0赋值给一个指针变量时,绝对不能企图使用该指针所指向的内存中的所存储的内容。
数组中实际不存在的溢界元素的地址位于数组所占内存之后,这个地址可以用于赋值和比较,但不能引用该元素。
if (bufptr == &buffer[N];
等效于
if (buffer > &buffer[N-1]);
数组buffer中的buffer[N]这个元素是不存在的,但是它的地址是存在的。等效于
if (buffer > &buffer[N-1]);
运算符&&和||首先对左侧的操作数求值,只在需要的时才对右侧的操作数求值。
运算符?:有三个操作数,a? b:c;中,操作数a首先被求值,根据a求得的值再求b或c的值。
逗号运算符,首先对左侧操作数求值,然后该值被“丢弃”,再对右侧操作数求值。
赋值运算符并不保证任何的求值顺序。
按位运算符&、|和~操作数的处理方式是将其视为一个二进制的位序列,分别对其每个位进行操作。
所有的无符号运算否是2的n次防为模,n是结果的位数。算术运算中一个是有符号整数,另一个是无符号整数,则有符号整数会被转换为无符号整数,溢出不可能发生。
若两个都是有符号整数时,溢出有可能发生,并且溢出的结果是未定义的,发生溢出时,做出的任何假设都是不安全的。
为main函数提供返回值:
若未显式的给出返回类型,则返回类型默认为整型。
大多数C语言实现都是通过main的返回值告诉系统该函数执行是成功还是失败。典型的处理方案是返回值0表示程序执行成功,非0执行失败,若不返回任何值,则有可能看上去执行失败。
extern int a;不是对a的定义,这个语句说明了a是一个外部整型变量,因为包括了关键字extern,显式地说明了a的存储空间是在程序其他地方分配的,从连接器的角度看,上述声明是一个对外部变量a的显式引用,即使出现在函数内部,也仍然具有相同的含义。
每个外部对象都必须在程序某个地方进行定义,如果程序中包括extern int a;则在程序中的某个地方必须有
int a;
如果一个函数仅仅被同一个源文件中的其他函数调用,就应该声明该函数为static。
一个函数在被定义或者声明之前被调用,那么它的返回类型就默认为一个整型。
要使一个函数能被main函数调用,则函数要么在main函数之前进行定义,要么在main函数之前进行声明。
若需要在两个不同的文件中分别定义函数main和函数f,则函数f只能有一个定义。如果f的调用和定义分别位于不同的文件中,那么必须在调用它的文件中声明f函数。
若一个函数中没有float、short或者char类型的参数,在函数声明中完全可以省略参数类型的说明,而定义中不能省略。float类型的参数会被自动转换为double型,short或char型参数会自动转换成int型,如:
int isvowel (char c)
{
return c == 'a'|| c == 'e'|| c =='i' || c == 'o' || c == 'u';
}
因形参为char型,则在调用该函数的其他文件中必须声明:
{
return c == 'a'|| c == 'e'|| c =='i' || c == 'o' || c == 'u';
}
int isvowel (char);
否则调用将把传递给isvowel函数的实参自动转换成int型,这样与形参类型就不一致了。必须保证一个特定的名称在所有外部定义在每个目标模板中都有相同的类型,并且是严格的相同。
解决外部类型不同的此类问题的方法:
每个外部对象只在一个地方声明,一般在一个头文件中,需要用到外部对象的所有模版都应该包括这个头文件,定义该外部对象的模版也应该包括这个头文件。