前一段时间忙保研,第一个选择是去中科院计算所,自己本身专业是通信的,暑假做了
电赛,结果没冲到国奖,反而还耽误了保研的事,当时点赛结束前保研工作就开始了,有的
同学暑假都把老师给定下了。唉,一天下午5点,还没有吃饭,临时接到电话,老师有事,提
前面试,能赶到尽量赶到。呵呵好不容易做动车在8:30赶到,等到面我的时候,自己疑问三
不知啊。老师给其他人做了下面的题目,但说我不是学计算机的,不给我做,不难为我。可
是拿了一张看看觉得自己还是会答一些的,可是最近蛋疼的验证一下,第一题不对,有些郁闷,
想写出来,结果写的时候,忽然明白了,果然写博客有好处……
不说了,上题:
(1)请给出下面代码在32位x86计算机上的运行结果
(2)如果不假设“32位 x86计算机”这一条件,回答上一问题时需要考虑哪些事项?
View Code
1 #include <stdio.h>
2 int main()
3 {
4 int a[5] = {1,2,3,4,5};
5 int *pa = (int)(&a) + 1;
6 printf("%x\n",*pa);
7 return 0;
8 }
实际输出结果为
2000000
这个题目好像应该是这样的,32位x86机为小端模式,一个int型占4字节,
这样上面的数组a[5]的存储形式(地址下从低到高依次是):10002000300040005000 ……(1)
但是实际如果用十六进制表示,每四位给表示一下就是01 00 00 00 02 00 00 00 03 00 00 00
04 00 00 00 05 00 00 00 ……(2)
我们假定(1)中从左右的地址为0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
所以这样就比较明朗了,当&a时取的是数组a[]的地址,即(1)中的a[0] 的起始字节,当然如果这
时候直接加上1之后&a+1就是20,但是这里强制转换成为int型,然后加1,却变成了1。接着将这个值
赋给一个整形指针,*pa就代表了起始地址为1的那个整数了四个字节内容为0002,但是要是按照%x
即十六进制输出,按照(2)就是2000000,前面的一个0没显示。
第二题
View Code
1 #include<stdio.h>
2 int main()
3 {
4 int x;
5 int a[5] = {0x11121314, 0x21222324, 0x31323334, 0x41424344,
6 0x51525354};
7 for(x = 0; x < 20;x++)
8 {
9 printf("%02x ",*(char *)((int)(&a) + x));
10 }
11 printf("\n");
12 for(x = 0; x < 8; x++)
13 {
14 printf("%08x ",*(int *)((int)(&a) + x));
15 }
16 printf("\n");
17 return 0;
18 }
按照之前的第一题的分析,可以得到这里a[5]的存储形式为 14131211 24232221 34333231 44434241 54535251
依然假设地址从左到右依次为0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
第一个for循环得用两位的形式显示字符型数据char的值,从地址0(即x=0时,(int)(&a)+x的值)
开始到19 依次输出为14 13 12 11 24 23 22 21 34 33 32 31 44 43 42 41 54 53 52 51
第二个for循环就简单了,按照第一题的分析,输出就是11121314 24111213 23241112 22232411 21222324 34212223 33342122 32333421.
吼吼,终于明朗~\(≧▽≦)/~啦啦啦
const char* const autherName = "Scott Mayers";
class GamePlayer(){
private:
static const int NumTurns = 5;
int scores[NumerTurns];
……
};
const int GamePlayer::NumTurns;//将此式放进一个实现文件而非头文件
class GamePlayer {
private:
enum { NumTurns = 5 };
int scores[NumTurns];
……
}
template<typename T> //由于我们不知道具体会操作什么类型,所以用模板
inline void callWithMax(const T& a, const T& b) //T是什么,所以采用
{ //pass by reference-to-const.
f(a > b ? a : b); //见条款20.
}
终于拿到《Effective C++》了,是侯捷翻译的,哈哈,首先说新版本的装订质量堪称一流啊,
用的是比较厚但很轻的那种纸,拿在手里就有一种很想读的欲望啊……
哈哈,今天先开个头,看了前面的导读之后,看条款一:视C++为一个语言联邦
大家都知道,C++一开始是在C的基础上加上了面向对象特性,甚至有的人就直接认为C++就是加了OPP的C语言,
这在n年以前好像应该是这样吧,但在近几年,C++逐渐增加了新的特性,大的方面就是Expresion(异常)的相
关问题、模板(template)、以及STL的引进。在后面的一些条款中应该有涉及。现在的C++同时支持过程形式、
面向对象形式、函数形式、泛型形式、元编程形式等,简直太niubility~\(≧▽≦)/~啦啦啦。因此在这里最简
单的就是接受这些,并”将C++视为一个由相关语言组成的联邦而非单一语言“在C++的四个次语言中分别遵守相
应的规则:
C(C part of C++):按照C的高效编程方式就行了,比如对于内置类型来说用值传递(pass by value)比用
引用传递(pass-by-reference)高效;
Object-Oriented C++: 这部分是oop理念的直接体现,主要涉及数据的封装、继承、多态、虚函数……等等,
那就按照oop去做啦,这时候采用引用传递(pass-by-reference-const)就往往比较好(原因是类一般是用户定
义的数据类型,有用户自己定义的构造和析构函数);
Template C++:这可是一大进步啊,这使得各种代码的通用性进一步加强,省了老多事。但这个也是跟oop很相
关的(如类模板),所以在参数传递着块要用引用传递啦;
STL(stand template library):虽然是template的库,但是为了使得各种数据结构在使用时不相互依赖,这玩
意还是没有用到类的继承等概念的,很多东西都是用C的指针弄出来的,当然随C了,用值传递吧~

