上一節寫了一篇不負責任的博文,被踩了呢,導致有點失落呢。
其實純問問題,的確是不好,因爲看博文很大一個優勢就是爲了更直接看到想看的東西。
好啦,迴歸整題。
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,和強制轉換操作符等。
圖片來自百度百科。