您的位置:首页 > 编程语言 > C语言/C++

c与c++关键字的用法总结

2015-07-08 14:36 232 查看
/*

1,关键字的总结

register:

(1),这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。

(2),register定义的变量:register int num=10;不能对其取地址。即不能:int *p=&num.

const:

(1),const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。

TYPE const ValueName = value;

const TYPE ValueName = value;

(2),将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义.

extend const int ValueName = value;

(3),const创建的全局变量不能修改,const创建的临时变量可以修改:

例如:const int n=10;

void main()

{

const int m=20;

int *p=(int*)n;

int *q=(int*)m;

*p=200;//可以修改

*q=300;

(4),c语言中const int a=10;

不可以作为数组的下标,即arr[a];因为他是一个变量。

c++中可以使用。

指针使用CONST

(5)指针本身是常量不可变

(char*) const pContent;

const (char*) pContent;

(6)指针所指向的内容是常量不可变

const (char) *pContent;

(char) const *pContent;

(7)两者都不可变

const char* const pContent;

函数中使用CONST

(8)const修饰函数参数

a.传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)

void function(const int Var);

b.参数指针所指内容为常量不可变

void function(const char* Var);

c.参数指针本身为常量不可变(也无意义,因为char* Var也是形参)

void function(char* const Var);

d.参数为引用,为了增加效率同时防止修改。修饰引用参数时:

void function(const Class& Var); //引用参数在函数内不可以改变

void function(const TYPE& Var); //引用参数在函数内为常量不可变

}

(9),const 修饰函数返回值

const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。

a.const int fun1() //这个其实无意义,因为参数返回本身就是赋值。

b. const int * fun2() //调用时 const int *pValue = fun2();

//我们可以把fun2()看作成一个变量,即指针内容不可变。

c.int* const fun3() //调用时 int * const pValue = fun2();

//我们可以把fun2()看作成一个变量,即指针本身不可变。

3,static:

c语言中:

(1)在C语言中,static可以用来修饰局部变量,全局变量以及函数。在不同的情况下static的作用不尽相同。

(2)修饰局部变量

一般情况下,对于局部变量是存放在栈区的,并且局部变量的生命周期在该语句块执行结束时便结束了。但是如果用static进行修饰的话,该变量便存放在静态数据区,其生命周期一直持续到整个程序执行结束。但是在这里要注意的是,虽然用static对局部变量进行修饰过后,其生命周期以及存储空间发生了变化,但是其作用域并没有改变,其仍然是一个局部变量,作用域仅限于该语句块。

在用static修饰局部变量后,该变量只在初次运行时进行初始化工作,且只进行一次。

如:

#include<stdio.h>

void fun()

{

static int a=1; a++;

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

}

int main(void)

{

fun();

fun();

return 0;

}

程序执行结果为: 2 3

说明在第二次调用fun()函数时,a的值为2,并且没有进行初始化赋值,直接进行自运算,所以得到的结果为3.

对于静态局部变量如果没有进行初始化的话,对于整形变量系统会自动对其赋值为0,对于字符数组,会自动赋值为'\0'.

(3)修饰全局变量

对于一个全局变量,它既可以在本源文件中被访问到,也可以在同一个工程的其它源文件中被访问(只需用extern进行声明即可)。

如:

int a=1;

file2.c

#include<stdio.h>

extern int a;

int main(void)

{

printf("%d\",a);

return 0;

}

则执行结果为 1

但是如果在file1.c中把int a=1改为static int a=1;

那么在file2.c是无法访问到变量a的。原因在于用static对全局变量进行修饰改变了其作用域的范围,由原来的整个工程可见变为本源文件可见。

(3)修饰函数

用static修饰函数的话,情况与修饰全局变量大同小异,就是改变了函数的作用域。

c++中:

在C++中static还具有其它功能,如果在C++中对类中的某个函数用static进行修饰,则表示该函数属于一个类而不是属于此类的任何特定对象;如果对类中的某个变量进行static修饰,表示该变量为类以及其所有的对象所有。它们在存储空间中都只存在一个副本。可以通过类和对象去调用。

4,volatile:

(1),volatile int const n=10;

编译器不会对n进行优化,

volatile int i=10;

int j = i;

...

int k = i;volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中

建议使用volatile变量的场所:

(1) 并行设备的硬件寄存器

(2) 一个中断服务子程序中会访问到的非自动变量(全局变量)

(3) 多线程应用中被几个任务共享的变量

5.typedef:

(1),typedef可以对程序进行一定的优化,例如

定义结构体:

struct stu{

int a;

int b;}

定义一个新的对象为:struct stu stu1;

如果使用typedef:

则:typedef struct stu Stu;

可以:Stu stu1;

(2);可以定义一个函数指针:

typedef int(*Pfun)(int a,int b,int c)

则*Pfun 就是一个函数指针:

6,define:

(1).简单的define定义

#define MAXTIME 1000

一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写

编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,

(2),define可以像函数那样接受一些参数,如下

#define max(x,y) (x)>(y)?(x):(y);

这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。

(3).在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。

就是:

#ifdef WINDOWS

......

......

#endif

#ifdef LINUX

......

......

#endif

(4),5.如何定义宏、取消宏

//定义宏

#define [MacroName] [MacroValue]

//取消宏

#undef [MacroName]

//普通宏

#define PI (3.1415926)

带参数的宏

#define max(a,b) ((a)>(b)? (a),(b))

(5),防止一个头文件被重复包含

#ifndef COMDEF_H

#define COMDEF_H

//头文件内容

#endif

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: