C/C++基礎筆試題1.1.2(運算符十問之解)

上一節寫了一篇不負責任的博文,被踩了呢,導致有點失落呢。

其實純問問題,的確是不好,因爲看博文很大一個優勢就是爲了更直接看到想看的東西。

好啦,迴歸整題。

1.你腦海中的運算符有哪些,按優先級排個序?

 這個問題明顯沒有標準答案,但是最基本的還是要有吧。

比如+ ,- ,* ,/ ,%, 前++/--,後++/--,=,<, >, << ,>>,(),&,^,|,~以及逗號","域名符"::",&&,||等等等等。

其優先級麻,這個可能會稍微麻煩一點,但是自己簡單試驗肯定可以做出來的。

所謂的優先級順序可以看博文最後的表。


2 .malloc/free 和 new/delete的區別?(我沒有跑題?!)

 從功能上兩者都是申請/釋放動態的數組但是,malloc/free是stdlib的函數,需要加頭文件stdlib,而new/delete是運算符。

1、malloc/free是C/C++中的方法(函數),new/delete是C++中的操作符。

2、malloc/free使用的內存空間爲堆區,new/delete是free store區。

3、free需要判斷非空,非空才能釋放,但是delete是不需要的

4、另外在使用new/delete是調用構造函數/析構函數,而malloc/free僅僅是對內存分配,也因此不能滿足非內部數據。

3.讓你來寫一個重載函數++i,i++,你怎麼寫? 

 這個是基本功

/***********************************************************
	> OS     : Linux 3.11.10-301.fc20.x86_64 Fedora20
	> Author : yaolong
	> Mail   : [email protected] 
	> Time   : 2014年07月17日 星期四 09時02分44秒
 **********************************************************/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
class A{
public:
    int x;
    A(int x=0){
        this->x=x;
    }
    A operator ++(int ){ //i++,先返回複製品,再搞原對象
        A tmp=*this ;
        this->x++;
        return tmp;
    }
    A operator ++(){//++i,直接修改對象
        this->x++;
        return *this;
    }
};
int main(){
    A a1(3);
    A a2=a1++;
    cout<<a2.x<<endl;; //3
    cout<<a1.x<<endl;  //4
    A a3=++a2;
    cout<<a3.x<<endl; //4
    cout<<a2.x<<endl; //4
}

4.來看個程序


#include<iostream>  
using namespace std;  
  
int main(){  
    int x=3;  
    cout<<x+x%2==1<<endl;  
     return 0;  
}  

這個程序是不能正常運行的,編譯錯誤,根據優先級看來是% , +  , <<, ==

所以整個式子解釋應該是

x%2    -> 1

x+ 1  -> 4

1<<endl  出錯了

下面假如式子變成這樣,

cout<<(x+x%2==1<<2)<<endl;

這樣整個式子的解釋是這樣的

因爲()優先級最高(在這個式子中),所以先解釋()內的

x%2 -> 1

x+1 ->4

1<<2  -> 4

4 ==4  得到1

之後到運算符<<

而<<是從左到右的,故cout<<1  之後再輸出轉行

輸出的爲

1

當我們這樣寫

int y=x+x%2==1<<2;

cout<<y<<endl;

這時候就沒有錯,爲什麼?因爲=號的優先級很低,只有逗號比其更低了,就只有一個

 我們不是經常這麼做嗎?

int x=3,y;

5.再來看一個?跟你想的又一樣不一樣?

#include<iostream>  
using namespace std;  
int main(){  
    int x=3;  
    cout<<((x+x%2)==1)<<endl;  
    cout<<(x+(x%2==1))<<endl;  
  
return 0;  
}  
這個用上面的分析,很容易就知道了

第一個先執行最裏層括號

(x+x%2)

而%比+優先,所以就是

x%2 ->1

x+1 -> 4

之後外層括號

4==1 -> 0(false)

第一個輸出爲0

第二個非常容易知道

x%2->1

1==1 -> 1(true)

x+1 -> 4

第二個輸出4

6.來個難一點的,感覺一下逗號和括號的噁心?

#include<iostream>
using namespace std;

void fun0(int x,int y ,int z){
  cout<<x<<" "<<y<<" "<<z<<endl;
  int a=2,b=3,c=7;
  x=a*b,c;
  y=(a*b+z,z=c);
  cout<<x<<" "<<y<<" "<<z<<endl;
}
void fun1(int x,int y,int z){
  cout<<x<<" "<<y<<" "<<z<<endl;
  int a=2,b=3,c=7;
  y=(x=a+b+z),(z=b+c);
  cout<<x<<" "<<y<<" "<<z<<endl;
}
void fun2(int x,int y,int z){
  cout<<x<<" "<<y<<" "<<z<<endl;
  int a=2,b=3,c=7;
  y=((x=a+b+z),(z=b+c));
  cout<<x<<" "<<y<<" "<<z<<endl;
}
int main(){
    int x,y,z;
    fun0(x,y,z);
    fun1(x,y,z);
    fun2(x,y,z);
}

這個題目是相對過分的,因爲手寫根本寫不出正確答案,不同編譯器輸出結果頁不一樣。

看fun0(x,y,z)

因爲x,y,z沒有初始值,所以每個函數的第一個輸出x,y,z都是編譯器默認的。

 int a=2,b=3,c=7;
  x=a*b,c;
  y=(a*b+z,z=c);
這個,先聲明瞭a=2,b=3,c=7

x=a*b,c

因爲逗號比=優先級低,前面說過,=號是倒數第二低,逗號是倒數第一,x=6,c沒有任何改變

y=(a*b+z,z=c)

先運行括號的東西

(a*b+z,z=c)

,號是從左到右運行,如果感興趣的朋友可以試驗一下(p=a*b+c,z=c),把p數出來就知道了

所以先執行表達式

a*b+z,得到2*3 +z(z是一個亂七八糟的數,我的GCC編譯出來的是32767),

再執行z=c,而(表達式1,表達式2,表達式……)最後返回的是最後一個表達式

所以y=z=c,y=7,z=7

第一個fun0在我這裏輸出爲

0 0 32767
6 7 7
對於fun1,2也是通=,的優先級來判斷

非常容易就可以推斷出來其結果

最後總的輸出爲

0 0 32767
32773
6 7 7
0 0 32767
32772 32772 10
0 0 32767
32772 10 10
下面再附帶一個fun3,用於測試上述到的逗號的從左到右執行

void fun3(int x,int y ,int z){
      cout<<x<<" "<<y<<" "<<z<<endl;
      int a=2,b=3,c=7,p;
      x=a*b,c;
      y=(p=a*b+z,z=c);
      cout<<p<<endl;
      cout<<x<<" "<<y<<" "<<z<<endl;

}

7.我們用%來做餘運算,%只能應用於正整數對嗎?

這個問題自己測試就可以拉,是可以對非0的整數進行操作,但是不能對浮點型等操作。

8.域運算符::我們常常用到,請問::可以重載嗎?

不可以的,運算符有一些是不能重載的。比如本題的::和.等等。在文章最後會有提到可否重載。

9.運算符重載作爲非成員函數重載時必須定義爲友元函數?

不是的,當操作的成員爲公開的時候不一定要定義友元函數。

10. 運算符必須是符號嗎?(即只能是+,-,*,/,::之類的嗎?)

不是的,文章一開始就提到了,new/delete是運算符。還有sizeof,和強制轉換操作符等。

圖片來自百度百科。




發佈了123 篇原創文章 · 獲贊 10 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章