今天下午去参加光电实验室的暑期实习生笔试,本来不大想去的,因为毕竟暑假已经确定了实习,所以即使通过了也肯定不会去的,而且到时候要解释的话也会很麻烦,不过作为国家重点实验室,我想看看笔试题目到底怎么样,也或许是因为最近刚好考试周完了,闲着蛋疼,所以就跑过去了。
原题目很简单,就是如下:
struct tr t[3] = {5,&t[1],7,&t[2],9,0};
struct tr *p;
p=&t[0];
然后列出了几个选项,让说出了分别哪一个表达式表示的值为6.具体选项就是:
p->n++ ++p->n (*p).n++ ++p->n
当然,题目的话选项还有些不记得了,不过觉得其实只要理解了原理,那么就很容易判断了。
先看代码:
#include <stdio.h>
struct tr{
int n;
struct tr *next;
};
int main(){
struct tr t[3] = {5,&t[1],7,&t[2],9,0};
struct tr *p;
p=&t[0];
printf("p->n++=%d\n",p->n++);
printf("p->n=%d\n",p->n);
printf("*p=%d\n",*p);
printf("(*p).n=%d\n",(*p).n);
printf("(*p).n++=%d\n",(*p).n++);
printf("++p->n=%d\n",++p->n);
}
运行结果如下:
p->n++=5
p->n=6
*p=6
(*p).n=6
(*p).n++=6
++p->n=8
Press any key to continue
首先,看看上面的题目中的那个初始化的含义吧!
struct tr t[3] = {5,&t[1],7,&t[2],9,0};
注意这样的一个结构体式可以初始化的,不同于C++的作用域限定范围!struct是公有的数据访问权限。
剩下了的问题就是,各个的含义是多少了。
p->n 表示的就是p指向的节点的证书范围域,所以是5,当然:重点来了,由于是说的表达式的值,所以分为前置和后置表达式的区别了。
(关于前置和后置的区别见我的这篇博文:http://www.cppblog.com/deercoder/archive/2010/01/22/106251.aspx
)
如果是p->n++,那么这个表达式的值为:5,但是运算完成之后,n的值会变化,所以n的值是6,但是表达式的值的含义要搞清楚,确切的说就是这个表达式的结果,由于后置的++是在完成之后才做的,所以不能影响到表达式的值,于是就为5。
而前置的++则是先进行++运算之后才得到运算的结果,所以如果是++p->n的话值就是6.
注意我的这个Demo的例子中,由于将所有表达式的值都放在一起输出,所以前面的操作会影响后面的值和表达式。比如第一个输出时5,但是会修改第一个节点的n值变为6,所以后面的输出相应的要修改!
题目中问的是值,所以直接单个的输出也是可以的,注意更能直接的看到结果。
另外很简单的几点是:
1. p-> 和 *p. 操作时一样性质,一直是直接指针访问,一个是用的先访问节点,然后通过节点的域来得到相应的值。
2.运算的优先级。注意->和.操作符的运算级都要高些,所以先进行的。
3.等价的写法。p->n ===========(*p).n
ps:前段时间忙着准备考试,考试周当然比较忙,而且突然发现最近博客没有怎么更新了,说明自己常常以各种借口放松对技术的学习,鄙视下自己,总结下前段时间的事情吧:
1.准备考研。说是准备,其实就是看看单词,不过觉得还是比较难,很多不认识,由于没有拿到保底的工作offer,所以现在就只能破釜沉舟了,后面也就没有参加或者不计划参加什么网易游戏,阿里巴巴,百度什么的笔试了,毕竟想起来要是暑假实习就耗上2个多月或者3个月的话,考研的事情就会彻底的泡汤了。
2.软考。再次华丽丽的裸考,大学里面的裸考很多啊,四六级都是,不过分数不错,而且我也比较容易满足,都是550+,虽然不高,不过一次性过了,而且没有付出的感觉还是很好。这次软件设计的考试,完全都没有时间准备,因为有期中考试和无尽的实验,虽然考到软件工程和设计模式的话我全部都是懵的,不过上午题目觉得问题不大,而下午的就觉得比较悬了,感觉凭着一点老底子,有一半希望吧。(数据流图,设计模式,软件工程完全不会啊~~)
3.考试周。昨天才考完,下半学期又要忙了,没办法,先缓缓吧。
posted on 2010-05-29 00:53
deercoder 阅读(1028)
评论(0) 编辑 收藏 引用 所属分类:
C++