写博客的原因

       很简单,要实习了,但我本科学的不是计算机专业,虽然本科也学了很多计算机的基础课程,但重心不在那上面。转计算机是觉得原来学的偏理论,希望学一门有用的工具来学以致用。

 第一夜:

学习源起网页:

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关于复杂声明的补充:援引资料:Dan Saksconst

不得不承认业精于勤荒于嬉,本来看到网页里说这个写的很好,但自己没当一回事,今天好奇看了下,确实有收获。

复杂变量声明的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互换顺序。


 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值