函数与程序结构
外部变量:
如果两个函数必须共享某些数据,而这两个函数互不调用对方,这种情况下最方便的方式是把这些共享数据定义为外间变量,而不是作为函数参数传递.在一个源程序的所有源文件中,一个外部变量只能在某个文件中定义一次,而其它文件可以通过extern声明来访问它.外部变量的定义中必须指定数组的长度,但extern声明则不一定要指定数组的长度.外部变量的初始化只能出现在其定义中.
如果把函数声明为static类型,则该函数名除了 该函数声明所在的文件可见外,其它文件都无法访问.
此处注意:与C#中static的含义完全相反.
逆波兰表示法中,所有运算符都跟在操作数后面,如下列中缀表达式:
(1-2)*(4-5)
采用逆波兰表示为:
1 2 - 4 5 + *
程序实现:
while(下一个运算符或操作数不是文件结束指示符)
if(是数)
将该数压入到栈中
else if(是运算符)
弹出所需数目的操作数
执行运算
将结果压入到栈中
else if(是换行符)
弹出并打印栈顶的值
else
出错
提示:可以把栈及相关信息放在外部变量中,并只供push与pop函数访问,而不能被main函数访问.
变量声明用于说明变量的属性(主要是变量的类型),而变量的定义除此以外还将引起存储器的分配.
寄存器变量:
register声明告诉编译器,它所声明的变量在程序中使用频率较高,其思想是,将register变量放在机器的寄存器中,这样可以使程序更小,执行速度更快.
register声明只适用于自动变量以及函数的形式参数.
C语言不允许在函数中定义函数,在不进行显示初始化的情况下,外部变量和靜态变量都将被初始化为0,而自动变量和寄存器变量的初值则没有定义(即初值为无用的信息).
数组初始化:
int days[]={31,28,30,31};
宏替换:
形式不能用带引号的字符串替换.但是,如果在替换文本中,参数名以#作为前缀则结果将被扩展为由实际参数替换该参数的带引号的字符串.
如:#define dprint(expr) prinft(#expr " = %q\n",expr)
使用语句:
dprint(x/y)
调用该宏,该室将扩展为:
printf("x/y" = &q\n",x/y);
其中的字符串被连接起来了,这样,宏调用的效果等效于
printf("x/y = &q\n",x/y);
条件包含:
#ifndef HDR
#define HDR "hdr.h"
#endif