每次翻开C语言的书,都会有新收获。其实,能够实现目的编程方法有很多,我们总是以最笨最繁琐的方法开始入手,然后随着理解的深入,笨方法逐渐淘汰,新的方法思路会使我们的程序更缜密精巧。因此不拘泥于现在,不断学习,才能让我们走得更高更远。
1、static 全局变量 和 非static全局变量的区别?
答:C程序可以由多个源文件组成。一个文件中定义全局变量,其他的文件中可以使用extern方式声明后,使用该全局变量。如果希望当前文件中的全局变量不能被其他文件使用,可以在全局变量的定义前加上关键字static,这样该全局变量就是一个static全局变量。
2、对静态局部变量的说明
1) 静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。
2) 静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
3) 如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。
3、带参宏定义
#define MAX(a,b) (a>b)?a:b
这是与函数中的情况不同的。在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”。而在带参宏中,只是符号代换,不存在值传递的问题。
#define SQ(y) (y)*(y)
sq=160/SQ(a+1);
input a number:3
sq=160
为什么会得这样的结果呢?分析宏调用语句,在宏代换之后变为:
sq=160/(a+1)*(a+1);
(宏定义在预编译阶段进行“宏代换”或“宏展开”)
4、条件编译
1. 第一种形式:
#ifdef 标识符
程序段1
#else
程序段2
#endif
2. 第二种形式:
#ifndef 标识符
程序段1
#else
程序段2
#endif
3. 第三种形式:
#if 常量表达式
程序段1
#else
程序段2
#endif
5、二维数组的初始化
例如对数组a[5][3]:
1) 按行分段赋值可写为:
int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} };
2) 按行连续赋值可写为:
int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};
6、字符数组初始化
char c[]={"C program"}; 或去掉{}写为:char c[]="C program";
用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。
指针方式:
char *ps; 赋值 ps="C Language";
而对数组方式:
char st[20]; 不能赋值:st={"C Language"};
而只能对字符数组的各元素逐个赋值。char st[]={"C Language"};