很简单,要实习了,但我本科学的不是计算机专业,虽然本科也学了很多计算机的基础课程,但重心不在那上面。转计算机是觉得原来学的偏理论,希望学一门有用的工具来学以致用。
第一夜:
学习源起网页:
http://bbs.yingjiesheng.com/thread-32387-1-1.html
1.1 define的用法
原来的理解define就是一个替代的命令,告诉编译器用什么替代什么,没什么意思。不过学到一些细节:
1;懂得在宏中小心地把参数用括号括起来;这算是一个良好的习惯。
ps:补充一个实例(5.31)
#define M(y) y*y+3*y //宏定义
k=M(5); //宏调用
k的值为:5*5+3*5,即40。若把实参的值改为2+3,即“k=M(2+3);”则k的值为多少?
1.2:static的作用
原来的理解就是静态变量,不可被更改。但这是把他跟const混淆了。static相对于dynamic,static变量是不在堆栈上,跟全局变量在一个地方。
但到此为止还是static的存储方式,static还有作用域,static修饰变量或函数,使之只在当前模块可见。很遗憾我现在都没编过要用到不同模块的程序,所以对这一点根本没什么理解。所以你看如果只是应付笔试面试,你要么知道要么“知道”。我在编MFC程序,两个dialog,一个dialog里写个static temp1,在另一个dialog里是没法访问的。也许这就是这个意思吧。不过也没可能犯这种错误啊。
static在C++里修饰类的成员的话还有另一番讲究:
1,在类中声明,在类外定义(赋值)
1.1 类中声明的相当于局部变量,可以和全局变量重名,同样起遮蔽作用,要使用全局变量请加全局作用域符::
该问题在下面的网页中有实例:
http://bbs.csdn.net/topics/390470143?page=1#post-394600526
2,按在类中声明的顺序进行初始化
3,以上是关于存储的,关于作用域,在类中的static的供同类的多个对象共享,这里“模块”指的就是类了。
1.3;const的作用
不可被更改、只读。理解的不错,但遇到下面的问题开始照样犯蒙:
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
这已经不是考察const的了,而是考察声明的规则。这里援引另一个网页的说明(他让我受益良多);
http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.html
百度百科上也有,但我不知道哪一天他会不会被改掉
理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。
对于这里的这些变量声明,只用从变量名向左看就行了。一二相同,
const int *a; a左边是个*号,说明a是个指针,再左边是个int什么他是个int型指针,再往左是const说明这个指针是const型,也就是这个指针指向一个const int a;
int * const a; a左边是const,说明a只读,再左边是个*,说明a是个指针,再左边是int,说明是个int型指针。
5.28的修正:const和int一样是type specifiers,出现在*前表示指针指向的a的数据类型,出现在*后表示指针的类型。故int * const a;表示一个指向int a的const指针。
通常我们说int型是指指针所指为int,这里const指针是指指针本身是const。
5.28的补充:const *int a;这个写法正确吗?不正确,指针本身没有int不int的说法。
int const * a const;这应该是写错了,
int const * const a ;a左边是const,说明a只读,再左边是个*号,说明a是个指针,再左边是const,说明指针是const,再左边int说明是个int型指针。
很遗憾我的代码量根本不破万,还没吃过不用const的亏,没法长这一智。
1.4 volatile的作用
重新看到这个关键字恍如隔世,真考到我就老实说不会了。volatile表示这个变量会被意想不到的改变(既然是意想不到,那怎么知道该给哪个设成volatile?你可以举例状态寄存器里的数(我刚看到的),但这些都是后验的吧?代码量不够就不知道了?
5.28的补充,在csdn上发帖讨论,详情见链接:
http://bbs.csdn.net/topics/390472587?page=1#post-394620819
对1.3关于复杂声明的补充:援引资料:D
不得不承认业精于勤荒于嬉,本来看到网页里说这个写的很好,但自己没当一回事,今天好奇看了下,确实有收获。
复杂变量声明的rule1:The operators in a declarator group according to the same precedence as they do when they appear in an expression.
意思就是说操作符在表达式里的优先级顺序同样适用于变量声明。
不知道这个规则跟前面那个人总结的是否是内在一致的,有兴趣的证明下。
复杂变量声明的rule2:The order in which the declaration specifiers appear in a declaration doesn’t matter.
意思是说const、int、static、volatile这些declaration specifers出现的顺序对结果没影响。但有一点需要注意:
The only declaration specifiers that can also appear in declarators are const and volatile.
也就是说const和volatile可以出现在*号后面和变量名构成declarator,这时不能和declaration specifiers互换顺序。