今天下午去參加光電實驗室的暑期實習生筆試,本來不大想去的,因為畢竟暑假已經確定了實習,所以即使通過了也肯定不會去的,而且到時候要解釋的話也會很麻煩,不過作為國家重點實驗室,我想看看筆試題目到底怎么樣,也或許是因為最近剛好考試周完了,閑著蛋疼,所以就跑過去了。
原題目很簡單,就是如下:
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.shnenglu.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 閱讀(1046)
評論(0) 編輯 收藏 引用 所屬分類:
C++