Re: [問題] 請教一些觀念題(指標,容量,reference)

看板C_and_CPP作者 (CJ Cat)時間10年前 (2014/10/25 14:31), 10年前編輯推噓6(607)
留言13則, 7人參與, 最新討論串2/2 (看更多)
※ 引述《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

10/25 14:34, , 1F
如果要真的找某型別的最大/最小值, 有一系列的 macro 能用
10/25 14:34, 1F

10/25 14:34, , 2F
對 int 來說是 INT_MAX 跟 INT_MIN
10/25 14:34, 2F

10/25 14:35, , 3F
這些 macro 定義在 <climits> 裡
10/25 14:35, 3F
※ 編輯: cjcat2266 (75.84.49.95), 10/25/2014 14:36:02

10/25 15:21, , 4F
overflow也是未定義行為
10/25 15:21, 4F

10/25 15:54, , 5F
噢,那這樣就如LPH所說的,用climit吧
10/25 15:54, 5F

10/25 17:24, , 6F
感謝! 我大概了解了! 想請問一下,所以最大/最小值的
10/25 17:24, 6F

10/25 17:25, , 7F
唯一解就是climit了嗎? 因為好多人提醒我undefined
10/25 17:25, 7F

10/25 17:26, , 8F
behavior
10/25 17:26, 8F

10/25 17:33, , 9F
因為若是用~MAX+1,在求MAX的同時還是overflow了...
10/25 17:33, 9F

10/25 17:43, , 10F
上一句推文,已假定是2補數系統了,1補數的話不成立。
10/25 17:43, 10F

10/25 17:43, , 11F
10/25 17:43, 11F

10/25 18:04, , 12F
shift 超過 signed 上限在新版裡好像改成 imp-def 了?
10/25 18:04, 12F

10/27 22:13, , 13F
C++有<limits>中的std::numeric_limits<int>::max()
10/27 22:13, 13F
文章代碼(AID): #1KIqFTwT (C_and_CPP)
文章代碼(AID): #1KIqFTwT (C_and_CPP)