問題描述:
看下面**,猜測一下執行結果?
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...