看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《kdok123 (小天)》之銘言: : ex1: : int a = pow(2,31); : cout << a; // -2147483658 : int b = pow(2,31)+1; : cout << b; // -2147283658 : 為什麼在int的情況就無法循環呢? pow的回傳值是浮點數 2的31次方的浮點數精準度會把1吸收掉 所以那個+1是沒有效果的 最後轉成整數,值就會一樣 解決方法是不用pow int a = 1 << 31; int b = (1 << 31) + 1; : ex2: : void test(char *&a) : { // 問題二 : cout << sizeof(a)/sizeof(char);// 想要在函數裡知道傳進來矩陣的長度 : 試了一些方式都不成功, : 請問有辦法達成這個功能嗎? : } : int main() : { : char a[] = {'1','2','\0'}; : char *b = "12"; : test(a);//報錯 : test(b);//正常 : //問題三:在沒有reference的情況兩個都可以傳進去,但有reference : 後矩陣就傳不進去了,為什麼? : return 0; : } 可以用一些"稍微花俏一點"的macro或者template達成 但是建議還是自己傳入陣列長度吧 char * & 是 reference to a pointer to a char a的型別是 array of 3 chars (編譯器會自動幫你在[]裡面塞上3) 兩者不是相容型別,但是array可以隱晦轉型為pointer 其值為array第一個元素的位址 在test裡實際執行的是 sizeof(char * &) / sizeof(char) sizeof(char) 永遠等於 1 所以整個expression最終只是等於 sizeof(char * &) 這個值在不同的環境下會不同 你的 test(b) 會正常只是剛好而已 你不管傳入多長的字串 b ,回傳值都會是 sizeof(char * &) : ex3: : 置底十三誡的第八誡要表達什麼呢? 我編譯出來沒遇到什麼問題 : 置底十三誡的第九誡,MACRO(++x)應該也跟第八誡要表達的一樣 : 想請問這兩邊要闡述什麼樣的觀念呢? int x = 0; int y = (x += 1) + (x *= 2); 這會產生未定義行為 你無法保證 x += 1 還是 x *= 2 會先執行 所以不同的環境下你會得到不同的結果 y 可能會是 3 也有可能會是 1 至於macro,請考慮以下範例 #define ADD(x, y) x + y int x = 10 * ADD(1 + 1, 1 + 1) * 5; 展開之後會變成 int x = 10 * 1 + 1 + 1 + 1 * 5; x 最後是 17 而不是想像中的 10 * 4 * 5 == 200 加上括弧後 #define ADD(x, y) ((x) + (y)) 展開結果是 int x = 10 * ((1 + 1) + (1 + 1)) * 5; 這才是你要的結果 -- Ming-Lun "Allen" Chou Web http://AllenChou.net Twitter http://twitter.com/TheAllenChou LinkedIn http://www.linkedin.com/in/MingLunChou -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 75.84.49.95 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1414218717.A.E9D.html ※ 編輯: cjcat2266 (75.84.49.95), 10/25/2014 14:34:23
LPH66: 如果要真的找某型別的最大/最小值, 有一系列的 macro 能用 10/25 14:34
LPH66: 對 int 來說是 INT_MAX 跟 INT_MIN 10/25 14:34
LPH66: 這些 macro 定義在 <climits> 裡 10/25 14:35
※ 編輯: cjcat2266 (75.84.49.95), 10/25/2014 14:36:02
CaptainH: overflow也是未定義行為 10/25 15:21
cjcat2266: 噢,那這樣就如LPH所說的,用climit吧 10/25 15:54
kdok123: 感謝! 我大概了解了! 想請問一下,所以最大/最小值的 10/25 17:24
kdok123: 唯一解就是climit了嗎? 因為好多人提醒我undefined 10/25 17:25
kdok123: behavior 10/25 17:26
kdok123: 因為若是用~MAX+1,在求MAX的同時還是overflow了... 10/25 17:33
EdisonX: 上一句推文,已假定是2補數系統了,1補數的話不成立。 10/25 17:43
CaptainH: 是 10/25 17:43
carylorrk: shift 超過 signed 上限在新版裡好像改成 imp-def 了? 10/25 18:04
ibmibmibm: C++有<limits>中的std::numeric_limits<int>::max() 10/27 22:13