※ 引述《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;
這才是你要的結果