前置声明,操作符++和--的用法之我见
2011-03-29 21:37
155 查看
前置声明
1、现象
所谓前置声明是指一个类型在定义之前就被用来定义变量和声明函数。
对于编译器来说,编译的源文件中可以前置声明各种未知是否定义的类型,但是需要使用该类型的话,就必须知道该类型的定义,编译器方可根据定义分配内存,否则编译器将会乐意的给你编译结果中报个错。
代码正常编译,成功运行,如果代码中需要使用这两个类型来定义变量的话,编译由于无法得知具体类型,无法合理分配内存,会给你类型未定义的错。
这个时候,如果需要使用Woods类型,可以包含具体定义该类型的,Wood.h,程序才能正常跑起来。
2、应用
目前有两个头文件A和B,在头文件A中定义类型A,在头文件B中定义类型B,如果B类型需要使用类型A,在A类型中需要使用类型B,这个时候如果头文件相互引用的话,是编译不通过的;这个时候前置声明就该发挥他的作用了,使用前置声明,编译器知道有这么一种类型存在,等到真正需要使用这个类型的时候,可以根据需要在运行给该类型分配内存。
操作符++和--以及在printf例子中的输出问题
废话先不说,首先看一个例子吧
为什么呢?
首先前置++和后置++操作符大家用的都不少吧,前置++是在整个语句执行完成之前增加使用该操作的变量,后置++操作符是在整个语句执行完成之后增加使用该操作的变量,就是这么简单。
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。
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。
相关文章推荐
- 前置声明,操作符++和--的用法之我见
- C++的前置声明与Exceptional C++中减少编译时依赖的意义和一些惯用法
- C++ 类声明 类前置声明
- 使用前置声明取代包含头文件
- js中对象的声明方式以及数组的一些用法示例
- Effective C++条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
- 关于C++中的前置声明(1)
- 前置声明
- 有关“类前置声明”和“包含头文件”的相关问题
- const的用法,以及声明const变量与宏的区别
- C++中的前置声明(Forward Declaration)
- 操作符“=”的巧妙用法和陷阱
- 6. 区别increment/decrement操作符的前置(prefix)和后置(postfix)形式
- c++ 之类的前置声明
- C++中前置声明和头文件包含
- 正确使用#include和前置声明(forward declaration)
- Google Guava中Preconditions的用法,让前置条件判断变得更优雅
- C++中的前置声明(Forward Declaration)
- 条款 11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
- 对类前置声明和包含头文件的一点理解