C 運算子,不能忘記的知識點

2022-03-20 09:51:11 字數 999 閱讀 6494

最近專案中有乙個bug被測試(是黑盒測試)發現了,跟了老半天**,才找到這個問題的所在,原來是乙個計算表示式中用到了??運算子,才導致了這個錯誤,下面讓我簡單講述一下。

c# ?? 運算子 msdn上的定義如下:

c#中的?? 運算子稱為 null 合併運算子,用於定義可以為 null 值的型別和引用型別的預設值。 如果此運算子的左運算元不為 null,則此運算子將返回左運算元;否則返回右運算元。

這句話的意思很好理解,比如:

int? x = null;

int y = x ?? -1;

那麼y的值就是-1,這是很好理解的。

下面看一下這段**的結果:

int? a = null;

int b = 12 - a ?? 1;

猜猜b的值是多少,或者很多人都會說是11,但是很遺憾的告訴你們不是,b的值是1(其實我想要的值也是11)。

這時候可能有人會想是不是??運算子的優先順序高於「-」,這樣想就錯了(開始我也是這麼認為的)。

那麼再看下下面的這段**的結果:

int? a = null;

a = 2;

int b = 12 - a ?? 1;

這段**b的值又是多少呢,這時候b的值是10。

你是不是有一點疑惑了,是不是不大理解了,其實我們可以這樣理解:無論在單個變數或是乙個運算表示式中(包含複雜的四則運算)如果有運算子??,如果??運算子左邊的運算元為null,則變數(或整個表示式)的結果則是右運算元;否則是正常運算的結果。

在開發中,這樣的小疏忽就很可能會產生很大的bug,那麼我們怎樣避免這的問題呢?

方法也是很簡單的,就是在有??運算子的外面加上乙個"()"這樣就會得到我們想要的計算結果了。**如下:

int? a = null;

int b =12 - (a ?? 1);

c 運算子過載 常用運算子 知識點

先給出一段 具體函式內容會在下面給出 class person bool operator person p 過載 bool operator person p 過載 person operator 前置 過載 person operator int 後置 過載 friend ostream ope...

移位運算子知識點

對資料在記憶體的中表示,進行按位移動,以此來達到計算目的的運算子。移位操作的變數自身不改變。對char型別資料進行移位運算時會對它的ascii碼值進行操作。對byte short或者char型別資料進行移位操作時,會先把它們自動 公升級 為int後再進行運算。左移運算子,每移動一位,相當於擴大2倍....

C 關於運算子過載知識點

1 除了類屬關係運算子 成員指標運算子 作用域運算子 sizeof運算子和三目運算子 以外,c 中的所有運算子都可以過載。2 過載運算子限制在c 語言中已有的運算子範圍內的允許過載的運算子之中,不能建立新的運算子。3 運算子過載實質上是函式過載,因此編譯程式對運算子過載的選擇,遵循函式過載的選擇原則...