OC中運算子 帶來的問題

2021-09-24 04:18:39 字數 819 閱讀 1497

問題描述:

看下面**,猜測一下執行結果?

nsinteger m1 = 100;

nsinteger m2 = -100;

nsuinteger n = 2;

nslog(@"m1 / n = %ld", m1 / n);

nslog(@"m2 / n = %ld", m2 / n);

問題分析:

這個問題看似很簡單,但是卻存在乙個坑,稍不注意就會掉進去。

上面**的輸出結果為:

m1 / n = 50

m2 / n = 9223372036854775758

那麼,為什麼m2 / n不等於-50呢?如果這樣列印nslog(@"m2 = %lu", m2);又會輸出什麼呢?

實際上,nslog(@"m2 = %lu", m2);的輸出結果為:m2 = 18446744073709551516

到這裡,你應該已經想到是怎麼回事了,這個就是oc中運算子型別的自動提公升功能導致的。m2 / n在計算中會先將m2轉換為nsuinteger型別再進行計算。

解決辦法:

我們想得到的結果是m2 / n = -50,所以需要對n做型別轉換,將m2 / n改為m2 / (nsinteger)n即可。

OC學習筆記之C中的運算子

分類 按照功能劃分 算術運算子,關係運算子,邏輯運算子,按位運算子 按照參與運算的運算元個數 單目運算,雙目運算,三目運算 運算子的優先順序 15級,1級最高,15級最低 運算子的結合性 優先順序必須相同,左結合右結合 算術運算子 左結合 第 第四級 例子 int a 10 int b 10 a b...

中雙目運算子 運算子過載

這節講c 中的運算子過載。方法有過載,運算子也有過載,設想一下,我們用加號計算int型別的資料,返回的也是int型別,這很正常,因為在數學中加號就是用來計算數字的。但是當我們用加號計算兩個string型別的資料時,給我們返回的則是兩個string資料連線在一起,難道加號應用於不同的場景,編譯器就會自...

C 中 運算子 和 運算子

運算子定義在將可空型別分配給非可空型別時返回的預設值。int?c null 若 c 為 null,則 d 為 1,否則把 c 值賦予 d int d c 1 型別名稱後加問號,如 int?i null double?d null bool?b null 可指定可為 null 的 int double...