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

作者: cjcat2266 (CJ Cat)   2014-10-25 14:31:53
※ 引述《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;
這才是你要的結果
作者: LPH66 (-6.2598534e+18f)   2014-10-25 14:34:00
如果要真的找某型別的最大/最小值, 有一系列的 macro 能用對 int 來說是 INT_MAX 跟 INT_MIN這些 macro 定義在 <climits> 裡
作者: CaptainH (Cannon)   2014-10-25 15:21:00
overflow也是未定義行為
作者: cjcat2266 (CJ Cat)   2014-10-25 15:54:00
噢,那這樣就如LPH所說的,用climit吧
作者: kdok123 (小天)   2014-10-25 17:24:00
感謝! 我大概了解了! 想請問一下,所以最大/最小值的唯一解就是climit了嗎? 因為好多人提醒我undefinedbehavior因為若是用~MAX+1,在求MAX的同時還是overflow了...
作者: EdisonX (卡卡獸)   2014-10-25 17:43:00
上一句推文,已假定是2補數系統了,1補數的話不成立。
作者: CaptainH (Cannon)   2014-10-25 17:43:00
作者: carylorrk (carylorrk)   2014-10-25 18:04:00
shift 超過 signed 上限在新版裡好像改成 imp-def 了?
作者: ibmibmibm (BestSteve)   2014-10-27 22:13:00
C++有<limits>中的std::numeric_limits<int>::max()

Links booklink

Contact Us: admin [ a t ] ucptt.com