某日二師兄參加XXX科技公司的C++工程師開發崗位第11面:
面試官:在C++中,你都知道都哪些運算子?
二師兄:啥?運算子?
+-*/=
這些算嗎?面試官:嗯,還有其他的嗎?
二師兄:當然還有,
+=,-=,*=,/=,==
,還有邏輯運算,位運算等,面試官:好的,那你知道這些運算的優先級嗎?
二師兄:(面試官傻逼吧,這誰記得住)記不住了,一般我都會加括號來表達我的意思,
面試官:好的,那你知道下面這段程式會輸出什么嗎?
#include <iostream>
int main(int argc, char const *argv[])
{
int i = 0;
std::cout << i++ + ++i << std::endl;
}
二師兄:應該是
2
吧,面試官:那你知道運算子的求值順序嗎?
二師兄:應該是從左向右?
面試官:
%
這個符號是求余的你應該知道吧,如果使用一個int
型負數對另一個int
型負數求余數,結果是正數還是負數?二師兄:應該是正數吧,
面試官:對一個整數判斷是否位
true
或者false
,可以用if(val == true)
或if(val == false)嗎?二師兄:不能,因為在使用
int
型與bool
型比較時,會把true
和false
轉換成int
型,上面兩個運算式等同于if(val == 1)
和if(val == 0),與我們的本意不符,面試官:你知道
a=a+1
和a+=1
這兩者的區別嗎?二師兄:兩者應該沒啥區別吧?
面試官:你知道
++i
和i++
的區別嗎?二師兄:前者回傳
i+1
,后者回傳i
,之后i
會被+1
,面試官:C++11中的左值右值你熟悉嗎?
二師兄:了解過一些(我很熟悉),
面試官:那你知道算數運算子、邏輯運算子、位運算子回傳的結果是左值還是右值嗎?
二師兄:額,讓我想想,,,應該都是右值,
面試官:好的,那你知道點(
.
)和箭頭(->
)運算子回傳的結果是左值還是右值嗎?二師兄:額,,,應該都是左值,(應該是的吧,,,)
面試官:我們都知道,一個
int
型的負數,在最高(31
)位上的值是1
,那么如果對這個負數進行右移(>>
)操作,最高位上的1
會被移動嗎?二師兄:應該不會,可能跟編譯器實作有關,
面試官:你知道多載運算子要注意哪些事項嗎?
二師兄:其實作業中很少多載運算子,我覺得最重要的事項就是盡量不要多載運算子,(我好機智,,)
面試官:好的,今天的面試結束了,回去等通知吧,
對于今日二師兄的表現,讓我們來回過頭看一下:
在C++中,你都知道哪些運算子?
除了算術運、邏輯、位、關系、等于運算子,如sizeof
,decltype
、new/delete
也屬于運算子,
知道下面這段程式會輸出什么嗎?
應該是
2
吧,
這里程式的輸出的結果是不確定的,原因會在下面講,
那你知道運算子的求值順序嗎?
在C++的標準中,大部分的運算子兩側的運算式的求值順序是不確定的,在上個例子中,可能會先計算i++,然后再計算++i,也可能反過來,所以這里的結果不缺行,屬于未定義的行為(undefined behavior
),
那么C++中有沒有確定求值順序的二元運算子呢?答案是有的,而且僅有這四個:&&
,||
,:?
,,
,C++標準保證這四個運算子的求值順序是從左到右確定的,
你知道
a=a+1
和a+=1
這兩者的區別嗎?
此兩者有一點區別,那就是前者的a
會被求值2
次,而后者只會被求值1
次,如果開啟編譯器優化,有可能會被優化相同的效果,
你知道
++i
和i++
的區別嗎?
除了二師兄的回答外,前置++的效率要高于后者,因為前者不需要快取值,以用來回傳,
知道點(
.
)和箭頭(->
)運算子回傳的結果是左值還是右值嗎?
這里箭頭運算子的呼叫者肯定是左值(想想看為什么),但是號運算子的呼叫者可不一定是左值,所以箭頭運算子的結果一定是左值,當點運算子的呼叫者是左值時,回傳值時左值,當點運算子的呼叫者是右值時,回傳值時右值,
負數進行右移(
>>
)操作,最高位上的1
會被移動嗎
很遺憾,這里回答會和不會都不對,因為這也屬于未定義的行為(undefined behavior
), 所以不要對有符號的型別進行按位操作,最好的情況是正好當前編譯器的實作和你的預期吻合,當前平臺運行無例外,一旦移植代碼,可能會遇到意想不到的問題,
你知道多載運算子要注意哪些事項嗎?
二師兄機智!非必要不需要多載運算子,如果一定要多載,請注意:(我還是不建議你多載運算子,回頭是岸,,,下面的規則都不用看了)
- 多載運算子必須至少有一個運算元是用戶定義的型別,這意味著不能多載內置型別的運算子,
- 多載運算子必須具有與原始運算子相同的優先級和關聯性,
- 多載運算子必須具有與原始運算子相同的引數數目,例如,二元運算子必須有兩個引數,一元運算子必須有一個引數,
- 多載運算子不能更改運算子的含義,例如,不能將“+”運算子用于減法操作,
- 多載運算子必須是類的成員函式或全域函式,如果是成員函式,則第一個引數必須是類的物件,
- 多載運算子不能更改運算元的數量或型別,例如,不能將二元運算子多載為一元運算子,
- 多載運算子不能具有默認引數,
- 多載運算子的回傳型別應該是運算子執行后的結果型別,
今日份面試到這里就結束了,小伙伴們,對于今天二師兄的表現能打幾分呢?如果是你,以上的問題都能回答的上來嗎?
關注我,帶你21天“精通”C++!(狗頭)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/554906.html
標籤:其他
上一篇:Xilinx GTH 簡介 ,CoaXpress FPGA PHY 部分
下一篇:返回列表