Linuxc基础 二十二

关键字(static)

作用:修饰变量(局部变量和全局变量)
静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使使用extern声明也没法使用他。
静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他函数也用不了
作用:修饰函数
用内部函数的好处:不同的人编写不同的函数时,不用担心自己定义的函数是否会与其他文件中的函数同名。

基本数据类型

在32位系统:short 2字节、int 4字节、long 4字节、float 4字节、double 8字节、char 1字节。
变量的命名规则:
1、命名应当直观且可以拼读,可望文知意,便于记忆和阅读。
2、命名的长度应当符合“min-length&&max-information”原则。
3、当标识符由多个词组成时,每个词的第1个字母大写,其余全小写。
4、尽量避免名字中出现数字编号,如Value1、Value2等,除非逻辑上的确需要编号,比如驱动开发时引脚命名,费边好名字反而不好。
5、队在多个文件之间共同使用的全局变量或函数要加范围限定符
标识符的命名规则:
1、标识符名分为两部分:规范标识符前缀(后缀)+含义标识。(非全局变量可以不使用范围限定符前缀)
2、禁止使用八进制的常数和八进制转义字符。

sizeof

注意:sizeof在计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略。

signed、unsigned

32位的signed int 类型整数,范围:-231~(231-1);8位的char类型数,范围:-27~(27-1)。
32位的unsigned int类型整数,范围:0~(2^32-1);8位的unsigned char类型数,范围:0~(2^8-1)。

 int main()
{
	signed char a[1000];
	int I;
	for(i=0; i<1000;i++)
	{
		a[i]=-1-i;
	
	}
	printf("%d",strlen(a));
	return 0;
	
}

其结果是255

float

四种射入方向:
1、像最接近的可表示的值;
2、当有两个最接近的可表示的值时,首选“偶数”值;
3、向负无穷大(向下);
4、向正无穷大(向上)以及向0(截断)。
五种类型的浮点异常是:无效运算、被零除、上溢、下溢和不精确。

else与if的配对

规定:else始终与同一括号内最接近的未匹配的if语句结合。
注意:if语句的后面不要加分号。
if语句的其他注意事项:
1、先处理正常情况,再处理异常情况。
2、确保if和else子句没有弄反。
3、赋值运算符不能使用在产生布尔值的表达式上。
4、所有的if-else if结构应该由else子句结束。

Switch case

1、每个case语句的结尾绝对不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。
2、最后必须使用default分支。
3、再switch case组合中,禁止使用return语句。
4、switch表达式不应是有效的布尔值。
case语句的排列顺序:
1、按字母或数字顺序排列各条case语句。
2、把正常情况放在前面,而把异常情况放在后面。
3、按执行频率pailiecase语句。

do、while、for

while循环:先判断while后面括号里的值,如果为真则执行其后面的代码;否则不执行。
break与continue的区别:
break关键字很重要,表示终止本层循环。
continue表示终止本次(本轮)循环。
循环语句的注意点:
1、在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
2、建议for语句的循环控制变量的取值采用“半开半闭区间”。
3、不能在for循环体内修改循环变量,防止循环失控。
4、循环要尽可能短,要是代码清晰,一目了然。
5、把循环嵌套控制在3层以内。
6、for语句的控制表达式不能包含任何浮点类型的对象。

void

void是空类型,“void* ”为空类型指针。
例如:

float *p1;
int *p2;
 p1=p2 ;

其中p1=p2语句会出错因该改成p1=(float*)p2;
用void就不同了

void*p1;
int*p2;
p1=p2;

注意:空类型可以包容有类型,有类型则不能包容空类型。
void也可以修饰函数的返回值和参数
1、如果函数没有返回值,则将其声明为void类型。
2、如果函数无参数,那么应声明其参数为void。
3、void不能代表一个真实的变量。

return

return用来终止一个函数并返回其后面跟着的值。
1、return语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁。

const

const只读变量,具有不可变性。
例如:

const int Max=100;
 int  Array[Max];

注意:const修饰的只读变量必须哎定义的同时初始化。
const修饰符也可以修饰函数的返回值,返回值不可改变。
const int Fun(void);
在另一链接文件中引用const只读变量:

extern const int i;//正确的声明
extern const int j=10;//错误,只读变量的值不能改变

注意:这里是声明不是定义

volatile

volatile是修饰符,用它修饰的变量表示
可以被某些编译器未知的因素更改。
volatile这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

struct

struct是定义结构体的。
柔性数组:c99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少有一个其他成员。
柔性数组的使用:

typedef struct st_type
{
	int i;
	int a[];
}type_a;

struct与class的区别:struct的成员默认情况下的属性是public,而class成员的却是private。

union

union维护足够的空间来放置多个数据成员中的“一种”,而不是为每一个数据成员配置空间。
在union中所有的数据成员共用一个空间,同一时间只能存储其中一个数据成员,所有的数据成员具有相同的起始地址。
例如:

union StateMachine
{
	char character;
	int number;
	char *str;
	double exp;
};

对于位域主要有以下两种用法:
1、访问较大数据类型中个别bit,或者一组bit(与union类型一起)。
2、允许将标志位或者其他短长度的数据压缩放置以节省空间。
位域本省有如下特点:
1、位域总是从字的第一个位开始。
2、位域不能与整数的边界重叠,也就是说一个结构中的所有域的长度之和不能大于字段大小。(如果更大,重叠域将字段作为下一个字的开始)
3、可以给未命名的域声明大小。
4、字段中可以有未使用的位。
5、不能使用位域变量的地址,意味着不能使用scanf函数将数字读入位域。
6、也不能使用位域变量的地址方式访问位域。
7、位域不能数组化。
8、位域必须进行赋值,且其值必须在位域的大小范围之内,如果赋值过大将发生不可预知的错误。
9、位域定义中的数据类型如果是signed,则其位于不能少于两位。(其中一位表示符号位)

enum

enum enum_type_name
{
	ENUM_CONST_1,
	ENUM_CONST_2,
	…
	ENUM_CONST_n
}enum_variable_name;

enum是定义常量的。
枚举与#define宏的区别:
1、#define宏常量是在预编译阶段进行简单替换;枚举常量则是在编译的时候确定其值。
2、一般在调试器里,可以调试枚举常量,但是不能调试宏常量。
3、枚举可以一次定义大量相关的常量,而#define宏一次只能定义一个。

typedef

typedef的意思是给一个已经存在的数据类型(是类型不是变量)取一个别名,而非定义一个新的数据类型。
用typedef重命名基本的数据类型,以代替原始的数据类型。

猜你喜欢

转载自blog.csdn.net/qq_41936758/article/details/84842601