作者cjcat2266 (CJ Cat)
看板C_and_CPP
標題Re: [問題] 請教一些觀念題(指標,容量,reference)
時間Sat Oct 25 14:31:53 2014
※ 引述《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