我参与8月更文挑战的第23天,活动详情查看:8月更文挑战
【程序41】
题目:学习static定义静态变量的用法
- 程序分析:static关键字是声明静态变量的;static int static_var=0; 定义一个静态变量,静态变量只会初始化一次,并且生命周期与全局变量一样。
- 程序源代码:
#include "stdio.h"
#include "conio.h"
varfunc()
{
int var=0;
static int static_var=0;
printf("\40:var equal %d \n",var);
printf("\40:static var equal %d \n",static_var);
printf("\n");
var++;
static_var++;
}
void main()
{
int i;
for(i=0;i<3;i++)
varfunc();
getch();
}
【程序42】
题目:学习使用auto定义变量的用法
- 程序分析: auto 关键字是声明自动变量的,正常情况下这个关键字不用写,因为默认就是自动变量。 描述:auto关键字在我们写的代码里几乎看不到,但是它又无处不在,它是如此的重要,又是如此的与世无争,默默的履行着自己的义务,却又隐姓埋名。 作用:C程序是面向过程的,在C代码中会出现大量的函数模块,每个函数都有其生命周期(也称作用域),在函数生命周期中声明的变量通常叫做局部变量,也叫自动变量。
- 程序源代码:
#include "stdio.h"
#include "conio.h"
main()
{
int i,num;
num=2;
for(i=0;i<3;i++)
{
printf("\40: The num equal %d \n",num);
num++;
{
auto int num=1;
printf("\40: The internal block num equal %d \n",num);
num++;
}
}
getch();
}
【程序43】
题目:学习使用static的另一用法。
- 程序分析: 普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。
普通局部变量存储于进程栈空间,使用完毕会立即释放。
静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。
变量在全局数据区分配内存空间;编译器自动对其初始化 其作用域为局部作用域,当定义它的函数结束时,其作用域随之结束。
- 程序源代码:
#include "stdio.h"
#include "conio.h"
main()
{
int i,num;
num=2;
for(i=0;i<3;i++)
{
printf("\40: The num equal %d \n",num);
num++;
{
static int num=1;
printf("\40:The internal block num equal %d\n",num);
num++;
}
}
getch();
}
【程序44】
题目:学习使用extern的用法。
- 程序分析: extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。
也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载啊,在这里不去过多的论述这个问题,如果你有兴趣可以去网上搜索,相信你可以得到满意的解释! 第二,当extern不与"C"在一起修饰变量或函数时,如在头文件中: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用,记住它是一个声明不是定义!也就是说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。 2. 程序源代码:
#include "stdio.h"
#include "conio.h"
int a,b,c;
extern void add();
void add()
{
int a;
a=3;
c=a+b;
}
void main()
{
a=b=4;
add();
printf("The value of c is equal to %d\n",c);
getch();
}
【程序45】
题目:学习使用register定义变量的方法。
- 程序分析:register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中, 以加快其存储速度。例如下面的内存块拷贝代码, /* Procedure for the ... 但是使用register修饰符有几点限制 register变量必须是能被CPU所接受的类型。 这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。
- 程序源代码:
#include "stdio.h"
#include "conio.h"
void main()
{
register int i;
int tmp=0;
for(i=1;i<=100;i++)
tmp+=i;
printf("The sum is %d\n",tmp);
getch();
}
【程序46】
题目:宏#define命令练习(1)
- 程序分析: 宏定义永远不要吝啬括号,防止因为优先级的问题导致出现不可思议的后果。 宏不能实现递归。 宏只文本替换,并不简化计算。 字符串中的内容不会发生宏替换。
- 程序源代码:
#include "stdio.h"
#include "conio.h"
#define TRUE 1
#define FALSE 0
#define SQ(x) (x)*(x)
void main()
{
int num;
int again=1;
printf("\40: Program will stop if input value less than 50.\n");
while(again)
{
printf("\40:Please input number==>");
scanf("%d",&num);
printf("\40:The square for this number is %d \n",SQ(num));
if(num>=50)
again=TRUE;
else
again=FALSE;
}
getch();
}
【程序47】
题目:宏#define命令练习(2)
- 程序分析: 宏没有函数的调用和返回等额外开销,效率更高, 当逻辑复杂并且代码量巨大时,调用和返回的开销和运算的时间相比微乎其微,可以省略 宏单纯只是文本替换,不能进行调试,很致命 宏可能会使代码长度增长 函数的参数如果是一个表达式,会计算出表达式的结果传入参数 宏的参数如果是一个表达式,只会文本替换,不会进行计算
- 程序源代码:
#include "stdio.h"
#include "conio.h"
/*宏定义中允许包含两道衣裳命令的情形,此时必须在最右边加上"\"*/
#define exchange(a,b) { \
int t;\
t=a;\
a=b;\
b=t;\
}
void main(void)
{
int x=10;
int y=20;
printf("x=%d; y=%d\n",x,y);
exchange(x,y);
printf("x=%d; y=%d\n",x,y);
getch();
}
【程序48】
题目:宏#define命令练习(3)
- 程序分析:
- 程序源代码:
#define LAG >
#define SMA <
#define EQ ==
#include "stdio.h"
#include "conio.h"
void main()
{
int i=10;
int j=20;
if(i LAG j)
printf("\40: %d larger than %d \n",i,j);
else if(i EQ j)
printf("\40: %d equal to %d \n",i,j);
else if(i SMA j)
printf("\40:%d smaller than %d \n",i,j);
else
printf("\40: No such value.\n");
getch();
}
【程序49】
题目:#if #ifdef和#ifndef的综合应用。
- 程序分析:
- 程序源代码:
#include "stdio.h"
#include "conio.h"
#define MAX
#define MAXIMUM(x,y) (x>y)?x:y
#define MINIMUM(x,y) (x>y)?y:x
void main()
{
int a=10,b=20;
#ifdef MAX
printf("\40: The larger one is %d\n",MAXIMUM(a,b));
#else
printf("\40: The lower one is %d\n",MINIMUM(a,b));
#endif
#ifndef MIN
printf("\40: The lower one is %d\n",MINIMUM(a,b));
#else
printf("\40: The larger one is %d\n",MAXIMUM(a,b));
#endif
#undef MAX
#ifdef MAX
printf("\40: The larger one is %d\n",MAXIMUM(a,b));
#else
printf("\40: The lower one is %d\n",MINIMUM(a,b));
#endif
#define MIN
#ifndef MIN
printf("\40: The lower one is %d\n",MINIMUM(a,b));
#else
printf("\40: The larger one is %d\n",MAXIMUM(a,b));
#endif
getch();
}
【程序50】
题目:#include的应用练习
-
程序分析: include的作用是拷贝右边文件的所有内容到#include所在的位置; 如果是系统文件我们用<>来引用;如果是自己写的文件,我们用双引号" "来引用; #include<stdio.h>的目的:拷贝printf函数的声明;
-
程序源代码:
test.h 文件如下:
#define LAG >
#define SMA <
#define EQ ==
主文件如下:
#include "test.h" /*一个新文件50.c,包含test.h*/
#include "stdio.h"
#include "conio.h"
void main()
{
int i=10;
int j=20;
if(i LAG j)
printf("\40: %d larger than %d \n",i,j);
else if(i EQ j)
printf("\40: %d equal to %d \n",i,j);
else if(i SMA j)
printf("\40:%d smaller than %d \n",i,j);
else
printf("\40: No such value.\n");
getch();
}