c程序语言设定定义域,4.22C语言学习日记:变量的定义域及编译预处理

学习笔记:

变量的存储类型:

静态存储方式:在程序运行期间由系统分配固定存储空间;从程序开始执行到程序结束;

动态存储方式:根据需要进行动态的分配存储空间;从包含该变量定义的函数开始执行至函数执行结束。

局部变量(内部变量):

概念:在函数内部定义的变量;函数的形参也是局部变量。

作用域:局部变量的作用域只在本函数内有效;在复合语句内部定义的变量,其作用域是包含它的复合语句。

局部变量的存储方式(自动变量;静态局部变量;寄存器变量):

自动变量(auto)

函数中的局部变量,不做任何存储类别的说明都为自动变量。

说明:

自动变量必须在一个函数体的内部,分配在动态存储区。

自动变量不赋初值,其值不确定。每调用一起,重新赋值一次。

函数的形参也是自动变量。

"自动"体现在进入语句块时自动申请内存,退出时自动释放内存;对它们分配和释放存储空间的工作由编译系统自动处理

静态局部变量(static)

函数调用结束后不消失,不释放存储单元。

定义:static 类型说明符 变量名;

特性:

系统自动初始化为0,存放在静态存储区;生存期为整个程序运行期间;

静态局部变量和全局变量都是静态存储类型,作用域不同;

静态局部变量在编译时赋初值,每次调用不再赋初值,保留调用结束时变量的值。其值在整个程序运行期间都不释放。

寄存器变量(register)

为了减少存取变量的时间,C允许将变量的值存放在CPU运算器的寄存器中。

定义:register 类型说明符 变量名;

说明:

变量类型一般只限于整型,字符型或指向整型和字符型的指针,且只用于局部变量和形参。

全局变量和局部静态储存变量不能作为寄存器变量。

只能定义有限个寄存器变量;不能取寄存器变量的地址。

全局变量(外部变量):

概念:在函数外面定义的变量称为全局变量。

作用域:全局变量具有全局的作用域和生存期,从定义的位置到本文件结束都可以使用。

全局变量的存储方法(外部类型;静态类型):

外部全局变量

一个文件中要引用其他文件中定义的全局变量,应该在需要引用此变量的文件中进行说明。

例如:extern int x;

静态全局变量

一个文件中的全局变量仅限于定义它的文件引用,而不能被其他文件访问,需要用static进行说明。

例如:static int y;

一个当时想了半天的例题

#include

int a=4;

int f(int n)

{

int t=0;

static int a=5;

if(n%2)

{int a=6;t+=a++;}

else

{int a=7;t+=a++;}

return (t+a++);

}

int main()

{

int s=a,i=0;

for(;i<2;i++)

s+=f(i);

printf("%d\n",s);

return 0;

}

运行结果为28。

内部函数:

定义:内部函数是只能被本文件中其他函数调用的函数,又称静态函数。

格式:static int fun( int a, int b )

外部函数:

定义:外部函数是允许被其它文件调用的函数。

格式:[extern] int fun (int a, int b )

使用说明:例如在源文件A中调用另一源文件B中的函数fun,则需要在源文件A中对函数fun进行说明,格式为:extern int fun( );

编译预处理:

预处理是在编译之前对程序中的特殊命令进行的处理工作。预处理命令有:

#define 宏定义

#include 文件包含

#if() 条件编译

宏定义:

一般的宏定义:

#define 宏名 字符串

在预处理时,将程序中宏定义之后出现的所有的宏名,用宏替换字符串代替。这个过程也称为宏展开。

带参数的宏定义:

#define 宏名(形参表) 字符串

调用格式:宏名(实参表)

终止宏定义:

#undef 宏名

一个上当的题目

#define X(a) a*a

int main()

{

printf("%d\n", X(4+5));

return 0;

}

答案是29!宏展开时候不会带括号,直接把字符串替换,如果想得到想要的答案最好在宏定义的时候加上括号(a)*(a)。

文件包含:

#include "文件名":先在当前目录下查找,再到系统指定目录下查找。

#include :在系统指定目录下查找。

条件编译:

格式:

#if 表达式

程序段 1

#else

程序段 2

#endif

当表达式为非 0 时,编译程序段 1,否则编译程序段 2;

#ifdef 宏名

程序段 1

#else

程序段 2

#endif

当宏名已经被 #define 命令定义过,则编译程序段 1,否则编译程序段 2。

课后测验:

输出最大、最小数

编写函数,通过键盘输入10个整数,找出其中最大的数和最小的数,返回到主调函数中输出。

输入:2 3 4 1 7 6 8 9 26 35

输出:max=35,min=1

我的思路:

开始想得很麻烦,定义两个函数用一一比较的方法一个求最大一个求最小,后来想了一下,定义一个无返回值的函数和两个全局变量就可以同时输出了。

#include

int max=1,min=1;

void max_min(int a[])

{

int i;

for(i=0;i<10;i++)

if(a[i]>max)max=a[i];

else if(a[i]

}

int main()

{

int i,a[10];

for(i=0;i<10;i++)

scanf("%d",&a[i]);

max_min(a);

printf("max=%d,min=%d",max,min);

return 0;

}

任意整数转换为千分位分隔的字符形式。

编写函数,对于任意输入的一个整数,转换为千分位分隔的字符形式,在主函数中调用并输出。

输入样例:123456

输出样例:123,456

我的思路:

定义一个全局变量的数组a,然后编写一个函数,一直除10取余放入局部变量b数组里,再将b数组逆向输出到a数组,其中a[3]为';',由于a数组定义的是char型,而数据为int型,所以要输出对应数字字符需要+48。

#include

#define N 10

char a[N];

void s(int n)

{

int i=0,j=0;

char b[N];

while(n)

{

b[i++]=n%10;

n=n/10;

}

for(i=i-1;i>=0;i--)

{

if(j==3)

{

a[j]=',';

j++;

}

a[j++]=b[i]+48;

}

a[j]='\0';

}

int main()

{

int x,i;

scanf("%d",&x);

s(x);

for(i=0;a[i]!='\0';i++)

printf("%c",a[i]);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值