您的位置:首页 > 其它

前置声明,操作符++和--的用法之我见

2011-03-29 21:37 155 查看
前置声明

1、现象

所谓前置声明是指一个类型在定义之前就被用来定义变量和声明函数。

对于编译器来说,编译的源文件中可以前置声明各种未知是否定义的类型,但是需要使用该类型的话,就必须知道该类型的定义,编译器方可根据定义分配内存,否则编译器将会乐意的给你编译结果中报个错。

#include <stdio.h>
#include <stdlib.h>
typedef struct _Jason Jason;/*struct _Jason类型具体定义未知*/
class Woods;/*Woods具体类型定义未知*/
int main()
{
return 1;
}


代码正常编译,成功运行,如果代码中需要使用这两个类型来定义变量的话,编译由于无法得知具体类型,无法合理分配内存,会给你类型未定义的错。

#include <stdio.h>
#include <stdlib.h>
typedef struct _Jason Jason;
class Woods;
int main()
{
Woods woods;
return 1;
}


这个时候,如果需要使用Woods类型,可以包含具体定义该类型的,Wood.h,程序才能正常跑起来。

2、应用

目前有两个头文件A和B,在头文件A中定义类型A,在头文件B中定义类型B,如果B类型需要使用类型A,在A类型中需要使用类型B,这个时候如果头文件相互引用的话,是编译不通过的;这个时候前置声明就该发挥他的作用了,使用前置声明,编译器知道有这么一种类型存在,等到真正需要使用这个类型的时候,可以根据需要在运行给该类型分配内存。

头文件A
#ifndef __A__
#define __A__
class B;
class A
{
private:
B *b;
};
#endif
头文件B
#ifndef __B__
#define __B__
class A;
class B
{
private:
A *a;
};
#endif


操作符++和--以及在printf例子中的输出问题

废话先不说,首先看一个例子吧

#include <stdio.h>
#include <stdlib.h>
int main()
{
int plus_plus = 1;
printf("%d/t%d/t%d/n", plus_plus++, ++plus_plus, plus_plus);
return 1;
}
/*运行结果是*/
/*2    2    1*/


为什么呢?

首先前置++和后置++操作符大家用的都不少吧,前置++是在整个语句执行完成之前增加使用该操作的变量,后置++操作符是在整个语句执行完成之后增加使用该操作的变量,就是这么简单。

printf是个函数,记得函数和临时变量都是在栈中申请空间的吗?参数是按照从左到右的顺序入栈的,所以在函数内部,使用参数的顺序是从右到左的,此时多余plus_plus变量:plus_plus初始值为1,接着++plus_plus之后,是2,plus_plus++之后,值还是2,完成该函数的调用后,值才增长为3。

所以这里变量打印的顺序为2,2,1。如果认真思考细节和深入了解的话,里面包含的内容的还是比较多的,有兴趣的人了解函数va_start和ve_end对函数变长参数的处理,这里也有篇文章参考:http://zhuyunxiang.blog.51cto.com/653596/129767。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: