题目:学习static定义静态变量的用法。
解析:这里没有什么题目可以讲。我来把static的相关概念罗列一下。
当我们使用static对一个变量进行声明时,有两种方式:
①、所有函数外,使用关键字static。
#include<stdio.h>
static int count; // 静态定义、内部链接
int main(void)
{
return 0;
}
②、块内 、使用关键字static。
#include<stdio.h>
void bore(int number);
int main(void)
{
int i;
scanf("%d", &i);
bore(i);
return 0;
}
void bore(int number)
{
static index; //静态、无链接
index = number;
}
在②中若不使用static对index变量进行声明,那么当这个函数执行完后,index变量所占的内存便会销毁。但如果使用static对index变量进行声明,那么当这个函数执行完后,index变量仍然存在内存中
第42题:题目:学习使用auto定义变量的用法。
解析:举一些例子和定义来说明auto变量的用法
auto关键字是存储类别说明符,常用于为了更清楚地表达你的意图时,显式使用关键字auto(例如,为了表明有意覆盖一个外部变量定义,或者强调不要把该变量改为其他存储类别)。
其次变量具有自动存储期,即:程序进入该变量声明所在的块时变量存在,程序退出该块时变量消失。
#include <stdio.h>
int main()
{
int num;
num = 6;
for (int i = 0; i<3; i++)
{
printf("块外 num 变量为 %d \n", num);
num++;
{
auto int num = 1;
printf("块内 num 变量为 %d \n", num);
num++;
}
}
return 0;
}
第43题:
题目:学习使用static的另一用法。
解析:之前41题已经做了详细的讲解,这里只用一个程序来举例子
#include <stdio.h>
int main()
{
int i, num;
num = 6;
for (i = 0; i<3; i++)
{
printf("num 变量为 %d \n", num);
num++;
{
static int num = 1; //第一次声明后,存储变量的内存不会销毁
printf("块内 num 变量为 %d\n", num);
num++;
}
}
return 0;
}
第44题:
题目:学习使用如何调用外部函数。
解析:首先要搞清楚什么外部函数,其次再是使用外部函数
外部函数:能被其他源文件调用的函数。在我们定义外部函数时,需要在函数的返回值前面添加extern关键字。
内部函数:只能在被定义的文件中使用。在定义内部函数时,需要在函数的返回值类型前面加static关键字,也被称作静态函数
①、外部函数:
// 头文件名为:extern.h
int sum(int x, int y)
{
return x + y;
}
//源文件
#include<stdio.h>
#include"extern.h"
extern int sum(int x, int y);
int main(void)
{
printf("sum = %d", sum(6, 7));
}
这里是头文件的引用,更加具体的例子,我放在了第50题
②、内部函数:
// 第一个源文件
#include<stdio.h>
void show()
{
printf("%s \n","inside.c");
}
//第二个源文件
#include<stdio.h>
static void show()
{
printf("%s \n", "This is inside function example");
}
int main(void)
{
show();
}
第45题:
题目:学习使用register定义变量的方法。
解析:讲定义与举例子。
寄存器变量存储在CPU的寄存器中,或者概括地说,存储在最快的可用内存中。与普通变量相比,访问和处理这些变量的速度更快。但是由于寄存器变量存储在寄存器而非内存中,所以无法获取寄存器变量的地址。在大多数情况下,寄存器变量和自动变量都一样。也就是说,它们都是块作用域、无链接和自动存储期。使用存储类别说明符register便可声明寄存器变量。
#include <stdio.h>
int main()
{
register int quick;
}
第46~48题:
题目:宏#define命令练习
解析:总结#define的各种用法
明示常量(符号常量):#define指令来定义
类对象宏定义的组成:
#define PX printf(“x is %d.\n”,x)
#define 是预处理指令
px 是宏
printf(“x is %d.\n”,x) 是替换体
常见的宏定义用法:
(1)、定义变量、字符串
#define LIMIT 20
#define FOUR 2*2
#define OW “Consistency is the last refuge of the unimagina”
(2)、在#define中使用参数
#define SQUARE (X) ((X) * (X))
#define MEAN(X,Y) (((X)+(Y)) / 2)
X与Y称为宏参数,MEAN(X,Y)称为宏,(((X)+(Y)) / 2)称为替换体
注意在宏中使用参数时,尽量使用足够的圆括号来确保运算符和结合的正确顺序,这一点很重要
(3)、用宏参数创建字符串:#运算符
在类函数宏的替换体重,# 号作为一个预处理运算符,可以把记号转换成字符串。
例如,如果x是一个宏形参,那么 #x 就是转换为字符串“x”的形参名
看下面一个例程
#include<stdio.h>
#define PSQR(x) printf("The square of "#x" is %d.\n",((x)*(x)));
int main(void)
{
int y = 5;
PSQR(y);
PSQR(2 + 5);
return 0;
}
(4)、预处理器黏合剂:##运算符
与 # 运算符类似,## 运算符可用于类函数宏的替换部分。 ## 运算把两个记号组成一个记号
#include<stdio.h>
#define XNAME(n) x ## n
#define PRINT_XN(n) printf("X" #n " = %d\n", x ## n);
int main(void)
{
int XNAME(1) = 14; //变成int x1 = 14;
int XNAME(2) = 20;
int x3 = 30;
PRINT_XN(1);
PRINT_XN(2);
PRINT_XN(3);
return 0;
}
(5)、变参宏:… 和 _ _VA_ARGS _ _
通过把宏参数列表中最后的参数写成省略号(即,3个点 … )来实现这一功能。这样,预定义宏
_ _ VA _ ARGS _ _ 可用再替换部分 中,表明省略号代表什么。例如下面的定义:
#define PR(…) printf( _ _ VA_ARGS_ _ )
#include<math.h>
#define PR(X,...) printf("Message " #X " :" __VA_ARGS__)
int main(void)
{
double x = 48;
double y;
y = sqrt(x);
PR(1, "x = %g\n", x);
PR(2, "x = %.2f,y = %.4f", x, y);
}
不难发现在上述代码中 “x = %g\n”, x 放在了 “Message " #X " :” VA_ARGS 中的**VA_ARGS** 这里,输出了 Message 1:x = 48时
题目:#if #ifdef和#ifndef的综合应用。
解析:定义与例子
#ifdef MAVIS
#include “horse.h” // 如果已经用 #define 定义了MAVIS,则执行这两行代码
#define STABLES 5
#else
#include"cow.h" //如果没有用#define 定义了MAVIS,则执行这两行代码
#define STABLES 15
#endif
#ifdef 指令说明,如果预处理器已经定义后面的标识符(MAVIS)则执行 #else 或者 #endif 指令之前的所有指令。如果未定义,就执行 #else 和 #endif 指令之间的 所有代码
#ifdef 和**#else很想C中的if else**。但两者的区别是:预处理器不识别用于标记块的花括号**{ },因此它使用#else** (如果需要) 和 #endif(必须存在)来标记指令块。当然这些指令可以嵌套
#define JUST_CHECKING
#define LIMIT 3
int main(void)
{
int i;
int total = 0;
for (i = 1; i <= LIMIT; i++)
{
total += 2 * i + 1;
#ifdef JUST_CHECKING
printf("i = %d , running total = %d\n", i, total);
#endif
}
printf("Grand total = %d ");
}
第50题:
题目:#include 的应用练习。
解析:#include的两种用法
<> 使用这种符号时,查找系统目录
" " 使用这种符号,查找当前工作目录
名字为names_st.h头文件
#include<string.h>
#define SLEN 32
typedef struct names_st
{
char first[SLEN];
char last[SLEN];
}names;
void get_name(names *);
void show_names(const names *);
名字为names_st.c源文件
#include<stdio.h>
#include"names_st.h"
void get_names(names *pn)
{
printf("Please enter your first name:");
scanf("%s", pn->first);
printf("Please enter your last name:");
scanf("%s", pn->last);
}
void show_names(const names *pn)
{
printf("%s %s", pn->first, pn->last);
}
主程序源文件
#include<stdio.h>
#include"names_st.h"
int main(void)
{
names candidate;
get_names(&candidate);
printf("Let's welcome ");
show_names(&candidate);
printf("to this program");
return 0;
}
第51~55题:
题目:学习使用按位与 &;学习使用按位或 |;学习使用按位异或 ^;学习使用按位取反~;取一个整数 a 从右端开始的 4~7 位。
分析:这几个题目是类似的,按位&、按位或|、按位异或^、按位取反~ 。这里的按位指的是按照定义的字节类型展开为对应的位数,。这里,我们使用8位二进制数来举例子,从左往右每位的编号为7~0。
按位&:(10010011)&(00111101)得到的结果为:00010001
按位或|:(10010011)|(00111101)得到的结果为:100111111
按位异或 ^: (10010011)^(00111101)得到的结果为:10111101
按位取反~: ~(10010011)得到的结果为:01101100
取一个整数 a 从右端开始的 4~7 位: 先让整数a右移四位,然后设置一个最后4位为1的数,按位相与即可得到由4~7位组成的一个数,当然也可以把这个转换成对应的二进制。
#include<stdio.h>
int main(void)
{
int number;
int mask = 15; //后4位全部为1
puts("Please enter a integer:\n");
scanf("%d", &number);
for (int i = 0; i < 4; i++)
number >>= 1;
number &= mask;
printf(" %d ", number);
return 0;
}
第56~60题:
题目:画图,学用circle画圆形;学用line画直线;学用rectangle画方形。另外两个题均为综合例子。
解析:这里需要用到头文件
具体的程序,由于我用的VS2013不好实现,故小可我就偷个小懒不在这里再详细码出。因为我觉得在用软件画图这方面有更强大的软件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)